惊奇发现!C语言连续定义两个字符数组出问题!

gaaracn 2011-07-12 04:51:07
C语言连续定义两个字符数组时,跟进debug就会发现,后面定义的字符数组虽然大小没错,但内容居然显示出是两个数组的和!程序如下:
int main(int argc, char* argv[])
{
char *str = "12345678abcdefgh";
char cArray1[8];
int i = 0;
char cArray2[8];

int len = strlen(str);

for (i = 0; i < 8; ++i)
{
cArray1[i] = str[i];
}
for (i = 0; i < len - 8; ++i)
{
cArray2[i] = str[i + 8];
}
printf("%s\n", cArray1);
printf("%s\n", cArray2);
return 0;
}
看图:

这是刚开始debug时,cArray2就已经显示内容为8字节16个字符了!

这是debug快结束时,看到cArray2的内容是12345678abcdefgh,16个字符!

而且printf出来真的给我这么显示md!气死我了!求解释!求大神!
然后我发现只要在两个连续的定义中间加一句别的,就不会出现这个问题了。
看图:

这样两个都是4字节8个字符。

debug显示正常

运行结果也正常。
是不是跟什么C的内存分配有关系啊?那块儿我可是真不懂!直接求指导啊,大神!
还有第一个字符串显示后面为什么不干净有个问号什么的。
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff007bit 2011-07-12
  • 打赏
  • 举报
回复
没加结束符~
图看不了~
pathuang68 2011-07-12
  • 打赏
  • 举报
回复
试试下面的代码:

int main(int argc, char* argv[])
{
char *str = "12345678abcdefgh";
char cArray1[9]; // 改成9
int i = 0;
char cArray2[9]; // 改成9

// 再加上下面两句
memset(cArray1, 0, 9);
memset(cArray2, 0, 0);

int len = strlen(str);

for (i = 0; i < 8; ++i)
{
cArray1[i] = str[i];
}
for (i = 0; i < len - 8; ++i)
{
cArray2[i] = str[i + 8];
}
printf("%s\n", cArray1);
printf("%s\n", cArray2);
return 0;
}
gaaracn 2011-07-12
  • 打赏
  • 举报
回复
我楼主参照3楼的建议试了一下,果然正常了。
没想过字符数组初始化、给结束符留位置多定义一个大小,居然能这么大程度的影响程序执行结果。领教了。结贴给分吧。不过想知道原来的程序出问题的具体机理是什么,欢迎不吝赐教。
ps:图片从百度空间里连过来的是百度不给力还是公司的网不给力?
金刚葫芦娃 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gaaracn 的回复:]
我是楼主,你们敢建一个控制台程序跑一下试试吗?对了
char cArray1[8];
int i = 0;
char cArray2[8];
这两个数组定义连着时才出问题。连续。就是这样
char cArray1[8];
char cArray2[8];
int i = 0;
[/Quote]

难道是内存对齐?
TitanQuest 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bdmh 的回复:]

char数组,不要满负荷,要留一个位置给结束符,否则不出错就算你幸运
[/Quote]
gaaracn 2011-07-12
  • 打赏
  • 举报
回复
我是楼主,你们敢建一个控制台程序跑一下试试吗?对了
char cArray1[8];
int i = 0;
char cArray2[8];
这两个数组定义连着时才出问题。连续。就是这样
char cArray1[8];
char cArray2[8];
int i = 0;
bdmh 2011-07-12
  • 打赏
  • 举报
回复
char数组,不要满负荷,要留一个位置给结束符,否则不出错就算你幸运
jackyjkchen 2011-07-12
  • 打赏
  • 举报
回复
没有结束符,没有初始化

数组长度定义为9
全初始化为零
lengwuqin 2011-07-12
  • 打赏
  • 举报
回复
图片看不到啊!
  • 打赏
  • 举报
回复
字符串结尾的 \0 你丢了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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