关于C++地址覆盖问题

itfootman 2009-06-04 11:19:09

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i = 1;
char buf[4];
strcpy(buf, "AAAA");
printf("%d\n", i);
return 0;
}

以上代码打印结果是 0;
按照地址分配原则:
在栈上先给i 分配4个字节
再给buf分配4个字节;
高地址放高字节,
低地址放低字节,

|buf0|---
|buf1|buf
|buf2|4byte
|buf3|---
| i | 4byte(高地址)
======
调用strcpy时由于长度差一位,
发生覆盖i的现象,i被字符串最后 一位的'\0'覆盖
于是i被赋0;

同理下面的情况却有所不同

int main()
{
int i = 2087512;
char string[10];
strcpy(string, "0123456789");
cout << i << endl;
system("PAUSE");
}


当我的用char string[10] 时正常
char string [9] 正常
...
[5] 正常
一直到长为5都正常,
用 char string[4] 覆盖
char string[3] 正常
char string[2] 覆盖
char string[1] 覆盖
这是怎么个现象,是不是和地址对齐有关啊,
好像对齐的也没什么规律,哪位大侠帮忙解释一下,多谢了。
刚申请的账号没有分,老号被封了(未知原因),所以还请大家无私一下,也当提升技术了,小弟多谢了。。
...全文
124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
a451274642 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 itfootman 的回复:]
引用 1 楼 mengde007 的回复:
引用楼主 itfootman 的帖子:
C/C++ code
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i = 1;
char buf[4];
strcpy(buf, "AAAA");
printf("%d\n", i);
……
[/Quote]
char buf[4];
后面加一句printf("%d,%d",&i,buf);输出他们的地址就知道了 你得到是1 说明 在你机子上他们的内存相差8 这里涉及到一点内存对齐的问题 每台机子上会不一样
a451274642 2010-08-20
  • 打赏
  • 举报
回复
这种字符串的覆盖基本都是内存的连续存储加4字节对齐引起的 比如你的第一个例子 在我这边buf的地址是1245048 i的地址是1245052 四个字节 所以我们可以推测内存分配从低到高时 XXXX1000(X表示字符串分配的内存,1000 是i=1的表示 右边是高 左边是低 这里我没打错)所以给字符串赋值后内存变成AAAA /0000
所以i输出时0
而第二个例子则要考虑到 内存对齐 这里你可以查查资料 ,由于每台机子的不同,结果可能不同 。在我这边 是当String[]分配的内存大于等于9的时候全部覆盖 我输出了下他们的地址, string[]内存小于等于4时 是1245048到1245052 差四字节 内存大于4到小于等于8 是1245044到1245052 差8字节 大于8的是 1245040到1245052差12字节以。而string[]=0123456789 是站11的内存的 所以在我自己上要大于等于9才能保证不覆盖,如果我没猜错 你输出下 你string[]大于等于5时的内存 他们之间相差肯定大于等于12,至于你string[3]时正常 我就不能解释了,如果说是覆盖后正好与i相等的话那也太巧了,求等达人解释。
gykgod 2009-06-04
  • 打赏
  • 举报
回复
是地址对齐的问题
char string[9]到char string[12]都按12个字节分配空间
这里以4个字节为基数对齐
内存里
0012FF70 30 31 32 33 34 35 36 37 38
0012FF79 39 00 CC 58 DA 1F 00

红的为string变量的空间,绿的是i
learningl 2009-06-04
  • 打赏
  • 举报
回复
也不一定就是覆盖,这和你的编译器有关,string问题,应该是和地址对齐有关,不过写程序的时候一定要注意不能这样恶搞啊
zjw6861982 2009-06-04
  • 打赏
  • 举报
回复
不同的OS、编译器采取不同的分配机制,具体要自己去体会。
itfootman 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
引用楼主 itfootman 的帖子:
C/C++ code
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i = 1;
char buf[4];
strcpy(buf, "AAAA");
printf("%d\n", i);
return 0;
}
以上代码打印结果是 0;

我的怎么为1;
[/Quote]
我用DEV C++ 是0, 有VS2005结果是1同时内存出错,还请帮忙解释一下
zjw6861982 2009-06-04
  • 打赏
  • 举报
回复
debug了一下,string变量的地址不同的数字长度下会有不同,从而导致又是覆盖有时不覆盖。

vC6.0 debug下:
&i 0012FF7C;

char string[10]: string 0x0012ff70; 显然不覆盖。
char string[9]: string 0x0012ff70; 显然不覆盖。
char string[8]: string 0x0012ff74; 覆盖2字节。


其他的可以自己一个个试,要看分配变量地址是采用什么机制,未必就是次序压栈的。
crst_zh 2009-06-04
  • 打赏
  • 举报
回复
什么覆盖不覆盖的?你能保证地址相邻?非要给buf[4]里拷贝5个,不怕崩溃?
mengde007 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 itfootman 的帖子:]
C/C++ code
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i = 1;
char buf[4];
strcpy(buf, "AAAA");
printf("%d\n", i);
return 0;
}
以上代码打印结果是 0;
[/Quote]
我的怎么为1;
gykgod 2009-06-04
  • 打赏
  • 举报
回复
CC也是红色 debug初始赋变量值CC

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧