C语言小程序 找运行时到哪一行出错误 求详细说明

#include<stdio.h>struct{charc;char*pc;}a;intmain(intargc,char*argv[]){char*p=&a.c;p[0... #include <stdio.h>

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; // 00000000 00000000 00000000 00000000 00000000
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;
}
展开
 我来答
todd_lau
2011-05-10 · TA获得超过170个赞
知道小有建树答主
回答量:155
采纳率:0%
帮助的人:129万
展开全部
a.pc = p;之前的语句都是起干扰作用,可以直接忽略。
且看a.pc = p之后,a.pc这个指针指向a.c,也就是结构提a的起始地址,
则有下图可以看到a.pc[0]到a.pc[7]所指向的内存如下
(注意32位编译器默认的4字节对齐):

+-----------------------------+
| a.c | // a.pc[0]
+-----------------------------+
| 字节补齐 | // a.pc[1]
+-----------------------------+
| 字节补齐 | // a.pc[2]
+-----------------------------+
| 字节补齐 | // a.pc[3]
+-----------------------------+
| a.pc 字节0 | // a.pc[4]
+-----------------------------+
| a.pc 字节1 | // a.pc[5]
+-----------------------------+
| a.pc 字节2 | // a.pc[6]
+-----------------------------+
| a.pc 字节3 | // a.pc[7]
+-----------------------------+

因此,当对a.pc[4] 到 a.pc[7]赋值的时候,也改变了a.pc本身的值,使指针无效。
对无效指针的递应用可能但并不一定会导致程序崩溃。
因此我判断a.pc[4]或之后语句可能会崩溃。

可以在对每个a.pc[x]赋值语句之后,打印a.pc的值看指针是否被破坏:
printf("a.pc: %p\n", a.pc);
追问
a.pc[5]=0;  //当到了这一步的时候a.pc[5]是先得到a.pc[5]的地址(这个地址可以取的到,因为a.pc[4]- a.pc[7]存放的值就是a.pc自己本身的地址),然后才是给这个地址去赋值 将其值赋值为零。
a.pc[4]=0; //当到这一步的时候,这个a.pc[4]的的地址值已经不正确了,指向的地址跑飞了,所以不正确。报内存错误。
百度网友b452582
2011-05-10 · TA获得超过2581个赞
知道小有建树答主
回答量:953
采纳率:100%
帮助的人:336万
展开全部
变量a是结构类型变量
变量p是字符类型指针
所以,指针p是不能用于记录变量a的地址的!
同时,a仅仅是一个结构类型的变量,在p=&a的情况下 p是不能够使用的下标的
后面变量引用的逻辑关系是错误的。
看起来你对指针应用的基本概念还不太清楚,一个没有被正确初始化的指针是不能直接使用的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
353767764
2011-05-10
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
#include <stdio.h>

typedef struct {
char *pc;
char c;
}a;

int main()
{
int i;
a p[6];
p[5].pc=0;
p[4].pc=0;
p[3].pc=0;
p[2].pc=0;
p[1].pc=0;
p[0].pc=0;

p[0].c=0;
p[1].c=0;
p[2].c=0;
p[3].c=0;
p[4].c=0;
p[5].c=0;

for(i=0;i<=5;i++)
printf("%d,%d\n",p[i].pc,p[i].c);
return 1;
}
看看你是不是想要这种结局。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式