1 对于以下代码段,正确的说法是:
char *p;
while (1) {
p = malloc(1);
*p = 0;
}
A. 最终程序会因为没有没有空间了而退出
B. 最终程序会因为向0地址写入而退出
C. 程序会一直运行下去
D. 程序不能被编译
答: 这里需要注意的是*p = 0
。我直接选了A,就是忽略了这个情况。实际逻辑是,如果没有没有把null地址占用,就会一致分配空间。
2 对于以下代码段:
int a[] = {1,2,3,4,5,};
int *p = a;
int *q = &a[5];
printf("%d", q-p);
当sizeof(int)为4时,以下说法正确的是:
A. 因为第三行的错误不能编译
B. 因为第三行的错误运行时崩溃
C. 输出5
D. 输出20
答: 这里考察的是指针的减法,指针的减法实际是地址间能存放多少个(int
)类型的值。这里a是数组,其地址是连续的。因此结合指针减法的定义知其之间能放5个int变量。测试一下,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 6
int main()
{
int a[] = { 1,2,3,4,5, };
int *p = a;
int *q = &a[5];
printf("p = %p q = %p a[5] = %p", p, q, &a[5]);
printf("%d", q - p);
return 0;
}