int num;
int *p2;
p2=#
printf("%p",p2);
char c='a';
int *pc=&c;
*pc=10;
Printf("%p",p2);
为什么两个p2的地址不一样?
*pc=10;修改为*pc=(char)10;
pc=10;修改为(char*)pc=(char)10;
这么试试看
你把 较长类型的指针指向较短类型
解引用的时候。进行读写必然造成越界访问。
然后相邻的数据,就被修改了
int* pc 改成 char* pc应该会好吧
*pc=10; 的时候越界了
你可以吧&p2的值打印出来,看看和pc指向的值差多少,可能差得不够4字节
/opt/test$ gcc test.c
test.c: In function ‘main’:
test.c:11:9: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
int *pc=&c;
^
/opt/test$ ./a.out
0xbfb2af40
0xbfb2af40
结果相同,但是编译器warning了,所以这样的写法是有点问题的,有的编译器生成结果相同,有的则出错。
猜想下,你的编译器是不是比较个性,假设栈中的数据是这样排列的:
指针变量pc
char c
指针变量P2
int num
前面都没问题,但是当你给指针变量赋值时,pc是一个int形指针,但c只是一个char形。赋值时,*pc 的 内容变了没错
*pc=10;
但是内容被写到 存放c 变量为首地址的一块 int形区域中,显然可能覆盖掉 P2变量本身的地址,
虽然P2的内容是指向num的地址,但P2的声明本身也有一个地址,如果这个地址被盖掉了,那么是不是不可预知的错误便出现了!
以上仅仅是猜测,因为我的编译结果是相同的,没问题的,所以没办法测试
John_ToDebug
的思路是对的,就是堆栈的问题,不过他的分析好像不完全正确。函数体内部的局部变量是在栈上分配的,堆栈分配局部变量是向从高地址向低地址扩展。而指针的引用是向高地址扩展(John_ToDebug
的图中栈的生长方向画反了),图中c只占一个字节存储空间(char),但是将pc将指针类型改为int *,这样对*pc赋值就会修改以pc为首地址的4个字节的存储空间,覆盖p2的值。