下列程序会在哪一行崩溃

来源:互联网 发布:ubuntu 文件夹映射 编辑:程序博客网 时间:2024/06/11 14:28
下面的程序在那行崩溃struct { char c; char *pc;} a; int main(int argc, char* argv[]){ char *p=&a.c; p[0]=0; p[1]=0; p[2]=0; p[3]=0; p[4]=0; p[5]=0; a.pc=p; a.pc[5]=0;    * a.pc[4]=0; a.pc[3]=0; a.pc[2]=0; a.pc[1]=0; a.pc[0]=0; return 0;}请给出解释!
a.pc[4]=0;出错。首先要知道a的构造,这涉及内存对齐的知识,a的成员c和pc之间有3个空白字节。所以a的实际大小是8字节。char *p=&a.c;//p指向a的首地址p[0]=0;//c成员变成0p[1]=0;p[2]=0;p[3]=0;//3个空白字节变成0p[4]=0;//成员pc的第2个低位字节变成0p[5]=0;//成员pc的最低位字节变成0a.pc=p;//pc成员指向a自身的首地址a.pc[5]=0;//把pc自身的最低位字节变成0了,注意,此时,pc的值不再是a的首地址,因此变成了个野指针,指向了未知空间,导致之后的a.pc[4]=0出错

下列程序会在哪一行崩溃

struct 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指向地址为1的地方,s.p[0]是地址1中存放的内容。所以不能输出s.p[1], //同样也不能对s.p[]赋值

s.p[0]=2;

}--------------------------------------------------------------------先看下面的程序

#include<stdio.h>

struct S

{

int i;

int *p;

int j;

};

void main()

{

S s;

int *p=&s.i;

p[0]=4;

p[1]=3;

printf("printf("&s.i=%x\n&p[0]=%x\n&p[1]=%x\n &s.p=%x\n&s.j=%x\n&p=%x\np=%x\n", &s.i,&p[0],&p[1],&s.p,&s.j,&p,p);

}

可以看到&p和&s.p的地址不同,说明这两个p不同,另外s.p存放的值是指向的变量(常量)的地址,而*s.p才是该变量(常量)的值。在该程序中s.p和p[1]等价,赋值3给s.p或p[1]存放的是地址3,而不是变量3,此时输出*s.p就会出错,因为不能对地址3中存放的内容进行非法访问。而s.i和p[0]等价则是变量。注:*s.p不是s.p所在地址的内容,而是s.p指向的地址中的内容。s.p[0]和s.p[1]同理。------------------------------------------------------------------------------------------------故上题中最后一句会出现崩溃,因为s.p[0]中存放的地址

原创粉丝点击