程序员面试宝典一书第7章,面试例题九,题目是问程序运行到哪一行会崩溃。
编写程序如下
#include <stdlib.h>
#include <stdio.h>
struct S
{
int i;
int *p;
};
int main(void)
{
struct S s;
int *p = &s.i;
p[0] = 1;
p[1] = 5;
printf("%d %d\n", p[0], s.i); //p = &s.i; p[0] == s.i;
printf("%p %p\n", &p[0], &s.i);
printf("%d %d\n", p[1], s.p); //p = &s.i; p[1] == s.p;
printf("%p %p %p\n", &p[1], &s.p, &s.p[1]);
s.p = p; //p = &s.i -> s.p == p == s.i
printf("%d %d\n", p[0], s.i);
printf("%p %p\n", &p[0], &s.i);
printf("%d %d %d\n", p[1], s.p, s.p[1]); //s.p[1] == *(&s.i + 1), 即s.i的地址加1,即为s.p。
printf("%p %p %p\n", &p[1], &s.p, &s.p[1]);
s.p[1] = 1;
printf("%d %p %p\n", s.p, &s.p, &s.p[1]); //s.p == s.p[1] 但是s.p[0] != s.i //*s.p 相当于s.p[0],都是未作声明的地址,访问会出错。
system("pause");
}
运行结果:
以下程序会崩溃,主要原因是对一个未作声明的地址访问,会出错。
s.p[0] = 2; //程序崩溃;
*s.p = 2; //s.p[0] 相当于*s.p
指针和数组访问是很灵活的,需要特别注意容易出错。