C指针程序员面试宝典例题解析

 
 

程序员面试宝典第五版P75面试例题9:以下程序会在哪一行崩溃?

C指针
 
  
strcut S{
int i;
int *p;
}
main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
}

int*p=&s.i;//将指针p指向s.i,即指针变量p的值=s.i的地址
所以*p=p[0]=s.i=4;
p[1]=*(p+1)=s.p=3;

s.p=p;//将指针变量p的值,也就是s.i的地址值赋给s.p指针,即s.p指针指向了s.i,即s.p[0]=*s.p=s.i;

 
 
s.p[0]=s.i;s.p[1]=s.p;
s.p[1]=1;//即将s.p的值赋值为1,此时s.p指针指向了内存为0x1的地方,
s.p[0]=*s.p=2;//此处报错:引发了异常: 写入访问权限冲突。s.p 是 0x1。
//也就是程序此处无权利去更改内存地址为0x1的内存单元的内容;
//对于一个未做声明的地址直接进行访问导致的访问错误!

这里主要考察C的指针、内存单元的概念,以及结构体的存储方式,(内存对齐)的知识。
在x86,32位的编译环境下,结构体S的结构变量s 占8个内存单元(8个字节,一个字节为一个内存单元),其中int i;整型变量占4个字节,指针*p占4个字节的内存空间,整个结构变量s占8个字节的内存单元。

C的取地址运算符&,取内容运算符*

清楚C中内存单元的地址,和该地址对应的这个内存单元里面存放的内容的关键概念


猜你喜欢

转载自blog.csdn.net/m0_37357063/article/details/79622279