下面的程序在那行崩溃 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成员变成0 p[1]=0; p[2]=0; p[3]=0;//3个空白字节变成0 p[4]=0;//成员pc的第2个低位字节变成0 p[5]=0;//成员pc的最低位字节变成0 a.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]中存放的地址