Linux和windows下字符数组的问题

每天学一点! 2018-10-30 07:00:10
首先是windows下用vs2013编译
void copy(char *src, char *dst)
{
for (; *src != '\0'; src++, dst++)
{
*dst = *src;
}
/**dst = '\0';*/
return;
}

int _tmain(int argc, _TCHAR* argv[])
{
char *s1 = "abcd";
char s2[5];
copy(s1, s2);
printf("s1=%s\n", s1);
printf("s2=%s\n", s2);

return 0;
}

输出结果:
s1=abcd
s2=abcd烫烫烫。。乱码


从输出结果是没有任何问题的,并且当我定义char s3[4]="abcd",编译器报错数组越界。这些都符合我的认识。。


但是以上代码在linux下运行,输出结果是
s1=abcd
s2=abcd
并且char s3[6]="012345";可以运行,且打印出来s3=012345

在Linux下的结果出乎的意料,首先有人建议在s2初始化的时候,会不会第5个字节刚好为空格或0,已经排除。
并且为什么s3[6]=“012345”可以运行,并且打印s3,结果为s3=012345,不合符常理啊。。。

最后,吐槽下CSDN的机制,本来已经开了一个帖子询问这个问题,但是一个人不能连续回复超过3次,导致我还要重新开一个帖子。跟之前那几位大哥们道个歉,不好意思!我已经单步调试过了。
...全文
239 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-10-31
  • 打赏
  • 举报
回复
这个问题就是栈的问题,越界了,不一定越到那个地方,可能是别的函数栈上,所以随机性很大。
老夏 2018-10-31
  • 打赏
  • 举报
回复
s2没有初始化,又只复制了前4个字符,作为字符串输出结尾没有'\0'来结束所以乱码。
字符串"abcd"后面实际还有一个'\0',所以实际应该是5个字符,所以s3[4]长度不足。
每天学一点! 2018-10-31
  • 打赏
  • 举报
回复



引用 8 楼 cfjtaishan 的回复:
[quote=引用 7 楼 songsong2017 的回复:]
[quote=引用 5 楼 colinfang2006 的回复:]
linux进程内存分布和windows不一样
你的程序还是错的,只不过恰好在linux能够运行罢了,而且也不能保证每次运行都是正确的


我试了好多遍,都成功了 .....[/quote]
随机性,如果了解内存,就不这么认为是好多遍没问题就是没问题了[/quote]

大佬,我对内存的理解只存留在内存四大区(堆栈这些),你说的这个随机性,我有点理解不了。有没有建议看下哪部分知识,谢谢
自信男孩 2018-10-31
  • 打赏
  • 举报
回复
引用 7 楼 songsong2017 的回复:
[quote=引用 5 楼 colinfang2006 的回复:]
linux进程内存分布和windows不一样
你的程序还是错的,只不过恰好在linux能够运行罢了,而且也不能保证每次运行都是正确的


我试了好多遍,都成功了 .....[/quote]
随机性,如果了解内存,就不这么认为是好多遍没问题就是没问题了
每天学一点! 2018-10-31
  • 打赏
  • 举报
回复
引用 5 楼 colinfang2006 的回复:
linux进程内存分布和windows不一样
你的程序还是错的,只不过恰好在linux能够运行罢了,而且也不能保证每次运行都是正确的


我试了好多遍,都成功了 .....
每天学一点! 2018-10-31
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
%s输出是遇到'\0'停止输出,如果一直找不到'\0',也可能会导致程序越界,出现段错误。


对啊,没错啊,这些在windows下都是正常的。但是在Linux下就不按常理出牌了 (1)s3[6]=“123456”能正常打印,压根没有内存去存放‘\0’;(2)s2,copy,注释加'\0'代码,结果s2也能正常打印。
636f6c696e 2018-10-31
  • 打赏
  • 举报
回复
linux进程内存分布和windows不一样 你的程序还是错的,只不过恰好在linux能够运行罢了,而且也不能保证每次运行都是正确的
自信男孩 2018-10-31
  • 打赏
  • 举报
回复
%s输出是遇到'\0'停止输出,如果一直找不到'\0',也可能会导致程序越界,出现段错误。
自信男孩 2018-10-31
  • 打赏
  • 举报
回复
引用 2 楼 songsong2017 的回复:
[quote=引用 1 楼 watersoft 的回复:]
s2没有初始化,又只复制了前4个字符,作为字符串输出结尾没有'\0'来结束所以乱码。
字符串"abcd"后面实际还有一个'\0',所以实际应该是5个字符,所以s3[4]长度不足。


你说的我都懂,并在windows下都符合以上所说。
但是这些,在linux下不一样,能正常使用,这才是我百思不得其解的地方。[/quote]
出现乱码是因为没有加'\0',不论是windows下还是Linux下,'\0'是字符串的结束标记都是一样的。
如果不加'\0',那么输出的结果可能是乱码也可能不乱码,这个是未定义的。
每天学一点! 2018-10-31
  • 打赏
  • 举报
回复
引用 1 楼 watersoft 的回复:
s2没有初始化,又只复制了前4个字符,作为字符串输出结尾没有'\0'来结束所以乱码。
字符串"abcd"后面实际还有一个'\0',所以实际应该是5个字符,所以s3[4]长度不足。


你说的我都懂,并在windows下都符合以上所说。
但是这些,在linux下不一样,能正常使用,这才是我百思不得其解的地方。
每天学一点! 2018-10-31
  • 打赏
  • 举报
回复
引用 10 楼 cfjtaishan 的回复:
这个问题就是栈的问题,越界了,不一定越到那个地方,可能是别的函数栈上,所以随机性很大。


https://blog.csdn.net/yes_i_am/article/details/52005602
我找了找,感觉和这个博主说的挺像,我回头在调试调试,感谢大佬回答。先结贴再说!

69,371

社区成员

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

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