-
由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义
A预处理 B编译 C链接 D执行答案: C。
在链接阶段会检查所有符号的定义和引用是否匹配,当发现有被调用的函数未定义时就会报错。
C语言文件的编译与执行的四个阶段并分别描述
和volatile为什么要修饰中断里的变量
2.下面两个结构体
struct one{
double d;
char c;
int i;struct Two{
char c;
double d;
int i;
}
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是
A.16,24,16,24
B.16,20,16,20 ,
C.16,16,16,24
D.16,16,24,24
答案:c
3.以下哪个选项一定可以将flag的第二个bit置0
A.flag&=-2
B.flag|=2
C.flag^=2
D.flag>>=2
答案:A.
2:0000 0010 第一个bit从右向左
-2 (按位取反):1111 1101
C 选项不确定会对第二位产生什么影响;^ 运算符表示按位异或操作。flag ^= 2 是一种简洁的赋值表达式,它将变量 flag 与值 2 进行按位异或操作,并将结果重新赋值给 flag。按位异或操作的规则是:对应位上的数字如果相同(都为 0 或都为 1),则结果为 0;如果不同(一个为 0,一个为 1),则结果为 1。
D 选项是移位操作,不会将特定位清零。
- 假定x=500,求下面函数的返回值
int fun(int x)
{int countx 0;
while (x){countx++;x=X&(x-1);
}
return countx;}
A2 B3 C.5 D.6
答案:D
1 1111 0100 & 1 1111 0011
1 1111 0000& 1 1110 1111
1 1110 0000 & 1 1100 1111
1 1100 0000 & 1 1011 1111
1 1000 0000 & 1 0111 1111
1 0000 0000 & 0 1111 1111 结束;
- 在C语言中,以下代码执行之后。p的值为
void func(int *p)
{static int num =4;p = #(*p)--;
}int main(){int i=5;int *p = &i;func(p);printf("%d",*p);return 0;
}
A.3 B.4 c.5 D.6
答案:c
在 func 函数中,p 被修改为指向静态变量 num ,然后 num 的值减 1 变为 3,但是在 main 函数中打印的仍然是原来 i 的值 5,所以答案选 C。
-
定义int *swap()指的是 ()
A一个返回整型值的函数swap()
B.一个返回指向整型值指针的函数swap()
C一个指向函数swap()的指针,函数返回一个整型值
D.以上说法均错
答案:B -
嵌入式系统中经常要用到无限循环,怎么用C编写死循环
A.while(){}
B.while(1){}
C.for(){}
D.for(;;){}
B
bd都可以,但是嵌入式选择b;
- 如果有
#define AREA(a,b) a+b
则语句
int s=AREA(3,4)*AREA(3,4)执行后s的值是
A.24 B.49 C.144 D.19
答案:D
宏只有替换的功能; 3+4*3+4=19
- 下面运算结果分别为 _和 _
#include<stdio.h>int main(){char*array=:"\\0\0";printf("strlen数组名=%d\n'',strlen(array);
printf("sizeof数组名=%d\n,sizeof(array);
答案:strlen 数组名=2
sizeof 数组名=4 或 8(具体取决于系统架构)
在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof操作符返回的是变量或类型所占用的字节数。
在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。转义字符’\0’在 C 语言中表示字符串的结束符。
当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。
而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。
10写出下面的结果
unsigned char Foo(void){
unsigned int a 6;
signed int b = -20;
if (a > b) {return 1;}
else {return 0;}
}
答案:0
当进行无符号数和有符号数的比较时,有符号数会被转换为无符号数。
在这里,b(值为-20)转换为无符号数是一个很大的正数,显然大于a(值为 6)。所以a > b不成立,函数会返回 0。
- 下述代码的执行结果
#include <stdio.h>#include <stdlib.h>
#include <string.h> int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
memcpy(a+3,a,5);for(int i=0;i<10;i++){printf("%d",a[i]);}return 0;
}
0120156789
因为memcpy的最后一个参数是需要拷贝的字节的数目!一个int类型占据4个字节!这样的话,本题5字节,实际上只能移动2个数字(往大的去)。
12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是
A Big-endian 低地址(12 34)高地址 ( 56 78)
B Big-endian 低地址(56 78 )高地址(1234)
C Little-endian 低地址(34 56 )高地址 (78 12)
D Little-endian低地址(78 12)高地址 (34 56 )
答案:B
其实上面说的是内存分布
实际上:
A. 12345678
B.56781234
C.1278 5634
D.56341278
大小端都得反一次;
在小端模式下,实际值0x12345678 在内存中的分布情况为(假设从地址 0x4000 开始存放):
地址 数据
0x4000 0x78
0x4001 0x56
0x4002 0x34
0x4003 0x12
在大端模式下,实际值:0x12345678 在内存中的分布情况为
0x4000 0x12
0x4001 0x34
0x4002 0x56
0x4003 0x78
- 按照需求,补充代码,保持如下函数接口定义:
a、 int malloc_array(int m,intn):二维数组空间分配,3行10列。
b、 void init_array(intarray,int m,int n):二维数组初始化赋值,其中第一行为等差数
列,第二行为等比数列,第三行为随机数()。
c. 二维数组的第三行的随机数使用冒泡法排序(void bubble_sort(int*array,int n)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int **malloc_array(int m, int n) {int **array = (int **)malloc(m * sizeof(int *));for (int i = 0; i < m; i++) {array[i] = (int *)malloc(n * sizeof(int));}return array;
}void init_array(int **array, int m, int n) {int i, j;// 第一行等差数列初始化for (j = 0; j < n; j++) {array[0][j] = j + 1;}// 第二行等比数列初始化array[1][0] = 1;for (j = 1; j < n; j++) {array[1][j] = array[1][j - 1] * 2;}// 第三行随机数初始化srand(time(NULL));for (i = 2; i < m; i++) {for (j = 0; j < n; j++) {array[i][j] = rand() % 100;}}
}void bubble_sort(int *array, int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}
}int main(void)
{int m=3,n=10,i=0,j=0:int*array=NULL;//定义二维指针,最终使用它指向二维数组srand((unsigned)time(NULL));//为二维数组开辟空间
arr = malloc_array(m, n);//为二维数组赋值
init_array(arr,m,n);//使用冒泡排序完成二维数组第三行排序,由小到大
bubble_sort(arr[2], n);//二维数组输出到屏幕,按行输出
for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {printf("%d ", arr[i][j]);}printf("\n");}// 释放内存for (int i = 0; i < m; i++) {free(arr[i]);}free(arr);return 0;
}