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;
} 展开
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;
} 展开
3个回答
展开全部
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 = 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]的的地址值已经不正确了,指向的地址跑飞了,所以不正确。报内存错误。
展开全部
变量a是结构类型变量
变量p是字符类型指针
所以,指针p是不能用于记录变量a的地址的!
同时,a仅仅是一个结构类型的变量,在p=&a的情况下 p是不能够使用的下标的
后面变量引用的逻辑关系是错误的。
看起来你对指针应用的基本概念还不太清楚,一个没有被正确初始化的指针是不能直接使用的。
变量p是字符类型指针
所以,指针p是不能用于记录变量a的地址的!
同时,a仅仅是一个结构类型的变量,在p=&a的情况下 p是不能够使用的下标的
后面变量引用的逻辑关系是错误的。
看起来你对指针应用的基本概念还不太清楚,一个没有被正确初始化的指针是不能直接使用的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
看看你是不是想要这种结局。
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;
}
看看你是不是想要这种结局。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询