下列程序会在哪一行崩溃

下面的程序在那行崩溃
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]中存放的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值