大侠们周五好,跪求一个解释!!!!

wzywatermelon 2011-05-06 12:02:01
int main( )
{
char string[10],str[10];
int i,j;
for(i=0;i<10;++i)
{
str[i]='a';
}
strcpy( string,str);
for(j=0;j<10;++j)
{
printf("%c\n",string[j]);
}
return 0;
}
最后什么都没打印出来,我把定义顺序换成了char str[10],string[10]; 竟然好用了,
我用的是vc6.0,小弟不才,跪求一个彻底的解释,为什么开始什么都没打印出来
...全文
175 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwyyxx26 2011-05-06
  • 打赏
  • 举报
回复
如果你的
char string[10],str[10];
是为了放字符串的话,还是初始化一下吧
wwyyxx26 2011-05-06
  • 打赏
  • 举报
回复
我觉得是个牛角尖
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
vc 可能有string 当关键字了 但应该会编译报错
VC 不是纯C编译器呀
vipvvv 2011-05-06
  • 打赏
  • 举报
回复
你交换之后出现正常,那是偶然情况,其实程序还是有问题的
ww884203 2011-05-06
  • 打赏
  • 举报
回复
一看就是越界了啊,把i=10和j=10里面的10改成9试试
xyhyou 2011-05-06
  • 打赏
  • 举报
回复
要给一个结束字符,这样子程序就不会出现问题,不然你这程序还是有问题
赵4老师 2011-05-06
  • 打赏
  • 举报
回复
任何内存单元在开机加电之后就有其值。
操作系统不可能替你保证:不让你访问你自己没填写过初始值的内存的每一个字节。
子达如何 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]

strcpy( string,str);
-------------------
这个函数需要'\0'结尾,这里越界溢出了
[/Quote]
这个大大功力深~,偶一下没看出来,二下也没看出来,惭愧啊!
恨天低 2011-05-06
  • 打赏
  • 举报
回复
交换了定义的顺序也是有错误的
wzywatermelon 2011-05-06
  • 打赏
  • 举报
回复
问什么交换了定义的顺序就好用了
wzywatermelon 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]
strcpy( string,str);
-------------------
这个函数需要'\0'结尾,这里越界溢出了
[/Quote]
我看了strcpy函数的实现,开始以为是没有\0的问题,但是后来好用了,我就蒙了。。
bdmh 2011-05-06
  • 打赏
  • 举报
回复

//初始化,最后要有一个结束符
char string[11]={0},str[11]={0};
int i,j;
for(i=0;i<10;++i)
{
str[i]='a';
}
strcpy( string,str);
for(j=0;j<10;++j)
{
printf("%c\n",string[j]);
}
wzywatermelon 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]
strcpy( string,str);
-------------------
这个函数需要'\0'结尾,这里越界溢出了
[/Quote]

可是我交换了定义的顺序,就好用了呀。。。
昵称很不好取 2011-05-06
  • 打赏
  • 举报
回复
strcpy( string,str);
-------------------
这个函数需要'\0'结尾,这里越界溢出了
pengzhixi 2011-05-06
  • 打赏
  • 举报
回复
换个编译器试试呗。另外就是 char string[10]={0},str[10]={0};
wzywatermelon 2011-05-06
  • 打赏
  • 举报
回复
没人回答么我么,中午都吃不下饭了。。。
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
我所说的没有问题是看 str 地址后面的情况而定 如果 str后面超过10字节之后才出现第一个'\0'字符 那么 你的第二种情况也是每输出的
aa_niaofang 2011-05-06
  • 打赏
  • 举报
回复
刚看了下 给你个解释 大概的原因。

strcpy 函数破坏了堆栈,你换了之后,本来栈中是

------------

string
------------
others 【我不太清楚什么东西】
------------
str
[aa..a]
------------
strcpy 之后

------------
string [aa...a]

------------
others
------------
str
[xx..a]注意这里的str已经被修改
-----------
所以你第二种情况下 str其实已经是乱码了。

在你未换之前 上图中str在上 string在下这样一copy 由于string 之下的内存不是你申请的
而换了之后 你覆盖的是 str所在的地址 而这块地址你是有权 使用的 所以不会有问题。
注:
哪个变量先定义哪个先入栈
qq675927952 2011-05-06
  • 打赏
  • 举报
回复


//初始化,最后要有一个结束符
char str1[11]={0},str[11]={0};
int i,j;
for(i=0;i<10;++i)
{
str[i]='a';
}
strcpy( str1,str);
for(j=0;j<10;++j)
{
printf("%c\n",str1[j]);
}


这样写哪怕你换顺序也没有关系 ....

69,382

社区成员

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

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