脚本之家(jb51.cc)C语言面试题栏目主要收集C语言开发工程师面试题,C语言开发人员面试专属面试题。
在这里,指出了一些需要使用 volatile 关键字的重要地方。 1、访问内存映射的外设寄存器或硬件状态寄存器。示例代码:
const 关键字是编译器强制执行的,它表示程序无法更改对象的值,这意味着它使对象成为不可修改的类型。例如:
是的,可以同时使用常量和易失性。 volatile 和 const 关键字的最大用途之一是在访问 GPIO 寄存器时。 在 GPIO 的情况下,如果它被配置为输入,它的值可以通过“外部因素”(如果开关或任何输出设备连接到 GPIO)
设置第 N 位设置第 N 位意味着如果第 N 位为 0,则将其设置为 1,如果为 1,则保持不变。 在 C 中,按位或运算符 (|) 用于设置整数数据类型的位。 据我们所知| (按位或运算符)计算一个新的整数值,其中每个位的
让给定的整数是a和b。 如果a的符号位与b的符号位不同,则a和b的符号位 (MSB) 的 EX-OR 将为 1。 换句话说,如果a和b的符号相反,a和b的异或将是负数。
有很多方法可以反转数字的位,这里描述了三种通用的方法来反转位。 方法一
参考以下代码实现: #define CHAR_BITS8// size of character #define INT_BITS( sizeof(int) * CHAR_BITS) //bits in integer
假设 a、b 两个数字,有很多方法不使用第三个变量交换两个数字的值。 方法1(使用算术运算符):
下面来看看如何编写一个小算法来检查 2 的幂。如果一个数字是 2 的幂,则函数返回 1。示例代码1:
请参考下面代码实现: unsigned int NumberSetBits(unsigned int n) { unsigned int CountSetBits= 0;
在C程序中有下面情节应该使用指针: 传递大型结构喜欢的服务器请求或响应数据包。
void 指针是通用指针。它没有关联的数据类型,这就是为什么它可以存储任何类型对象的地址并类型转换为任何类型的原因。根据 C 标准,指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。 void 指
C语言中的 void 指针有以下优点: 使用 void 指针,可以创建一个可以接受任何数据类型参数的通用函数。 memcpy 和 memmove 库函数是泛型函数的最佳示例,使用这些函数可以将数据从源复制到目标。例如:
通常,当引用对象被删除或释放时,会出现延迟指针,而不会更改指针的值。 它会产生问题,因为指针仍然指向不可用的内存。 当用户尝试取消引用悬空指针时,它会显示未定义的行为,并且可能是分段错误的原因。
在首次使用之前未正确初始化的指针称为野指针。 未初始化的指针行为是完全未定义的,因为它可能指向某个可能导致程序崩溃的任意位置,这就是它被称为野指针的原因。换句话说,编程语言中没有被编译器或程序员初
根据 C 标准,值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式称为空指针常量。 如果将空指针常量转换为指针类型,则生成的指针称为空指针。语法:
函数指针类似于其他指针,但唯一的区别是它指向函数而不是变量。换句话说,函数指针是一种存储函数地址的指针,这些指向的函数可以在程序中随时被函数指针调用。
声明函数指针的语法非常简单。 一开始似乎很难,但是一旦熟悉了函数指针,它就会变得容易。函数指针的声明类似于函数的声明。 这意味着函数指针还需要返回类型、声明名称和参数列表。 需要记住的一件事是,每当
有很多地方可以使用函数指针。 通常,函数指针用于实现回调函数、有限状态机以及提供C语言中的多态特性等。
数组和指针之间的一个重要区别是数组中元素的地址始终是固定的,不能在执行时修改地址,但对于指针,可以根据需要更改指针的地址。考虑下面的例子:
根据 C 标准,有四种存储持续时间,静态、线程 (C11)、自动和分配。存储期限决定了对象的生命周期。
内存泄漏是一个常见且危险的问题。 这是一种资源泄漏。 在 C 语言中,当使用内存管理功能分配一块内存而忘记释放它时,就会发生内存泄漏。示例:
malloc 和 calloc 是内存管理函数。 它们用于动态分配内存。 基本上,calloc 和 malloc 之间没有实际区别,只是 calloc 分配的内存用 0 初始化。在 C 语言中,calloc 函数将所有分配的空间位初始化为零,但 mal
realloc()函数用于调整分配的内存块的大小。 它有两个参数,第一个是指向先前分配的内存的指针,第二个是新请求的大小。realloc()函数首先释放旧对象,然后重新分配新指定的大小。 如果新大小小于旧大小,则新分
如果请求空间的大小为零,则行为将由实现定义。 malloc 的返回值可能是一个空指针,或者它表明该大小的行为是某个非零值。 标准建议不要使用指针来访问当大小为零时由 malloc 返回的对象。
内存管理功能保证如果内存被分配,那么它将适当地与任何具有基本对齐的对象对齐。基本对齐小于或等于没有对齐规范的实现所支持的最大对齐。动态内存分配的主要问题之一是碎片,基本上,碎片发生在用户没有有效使
当我们调用内存管理函数(malloc、calloc 或 realloc)时,这些函数会保留额外的字节用于簿记。每当调用 free() 函数并传递指向已分配内存的指针时,free()函数都会获取簿记信息并释放分配的内存。 无论如何,如果
在 C 语言中,可以使用 sizeof 运算符计算静态数组的大小,但没有运算符来计算动态分配的内存大小。主要有两种方法可以在代码的每个部分中获取分配的内存大小。
这两个副本函数都用于将 n 个字符从源对象复制到目标对象,但它们有一些区别,如下所述。
C语言是一种中级和过程编程语言。 过程编程语言也称为结构化编程语言,是一种将大型程序分解为较小模块的技术,每个模块都使用结构化代码。 这种技术可以最大限度地减少错误和误解。C语言被认为是其他编程语言的