C的笔试题总结1

这是一家公司的笔试题,我应聘的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};

原文地址:https://www.cnblogs.com/philospy/p/4148856.html