这是一家公司的笔试题,我应聘的C开发工程师,10月31日当天晚上听宣讲会然后当场笔试,当时有点感冒,稀里糊涂的笔试就过了,人家在凌晨2点发短信通知自己第二天去面试,有技术面和HR面,虽然最终没通过,可是也敬佩这家公司的效率,下面是整理的部分笔试题,供参考。
一.选择题:
1.下面赋值语句正确的是: D. char a = '103';
2.下面函数执行后的结果是:1, 2
1 int a, x; 2 3 for (a = 0, x = 0; a <= 1 && !x++;) 4 { 5 a++; 6 } 7 8 printf("a = %d, x = %d ", a, x);
3.下面程序的运行结果是:8, 8
1 int arr[] = {6, 7, 8, 9, 10}; 2 int *ptr = arr; 3 4 *(ptr++) += 123; 5 printf("%d, %d ", *ptr, *(++ptr));
注意:1.这里修改的是arr[0]的值为129;
2.结果为8,8的原因在于函数参数入栈的顺序是从前往后的,而非优先级的影响。
4.下面说法错误的是: A、char *ptr = strdup ("iPanel"); ptr的地址指向iPanel常量的地址。
strdup函数的功能是将字符串拷贝到新建的位置。用法说明如下:
1 char *str = "iPanel"; 2 char *ptr; 3 4 ptr = strdup (str); //create a new postion 5 6 printf("%p, %p ", str, ptr); 7 printf("%s, %s ", str, ptr);
5.下面程序的运行结果是:cb ......为退格符
1 printf("abc ");
6.下面语句错误的是:ABCD,这里都是操作非法内存的现象
1 A. 2 short a[4]; 3 int *b = (int *)&a[0]; 4 memset(b, 0, 4 * sizeof(int));
1 B. 2 short a[4]; 3 int *b = (int *)&a[2]; 4 memset(b, 0, sizeof(a));
1 C. 2 short a[4]; 3 int *b = (int *)&a[0]; 4 b+=3; 5 *b = 2;
1 D. 2 short a[4]; 3 int *b = (int *)&a[0]; 4 b[3] = 2;
二:简答题
1.求*(p++)->a的值:
1 struct tagValue{ 2 int a, *b; 3 }*p; 4 int x[] = {1, 2}, y[] = {3, 4}; 5 static struct tagValue c[2] = {5, x, 6, y}, p=c;
我始终觉得上述代码本身存在至少两处错误,所以结果应该是error。
2.实现8字节对齐函数,即满足任意数能够被8整除。
1 int ByteAlign(int n, int size) 2 { 3 return ((n+size-1) & ~(size-1)); 4 //return (n+size-1)/size*size; 5 }
三、编程题
实现有序插入函数。
请把下列数组的元素全部插入到另外一个数组,并保持从小到大排列。
int a[] = {1, 2, 3, 4, 9, 5, 7, 0, 6, 8};