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次,导致我还要重新开一个帖子。跟之前那几位大哥们道个歉,不好意思!我已经单步调试过了。
...全文
270 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
我找了找,感觉和这个博主说的挺像,我回头在调试调试,感谢大佬回答。先结贴再说!
第1章 PHP 5基础 1.1 简介 1.1.1 PHP是什么 1.1.2 初步认识PHP代码 1.2 PHP的安装 1.2.1 Linux下安装.Apache和PHP 1.2.2 Windows下安装Apache和PHP 1.3 PHP配置 1.3.1 PHP配置文件 1.3.2 PHP常用配置选项 1.3.3 加载扩展库 1.4 本章小结 第2章 网站开发语法基础 2.1 基本语法 2.2 数据类型 2.2.1 布尔型 2.2.2 整型 2.2.3 浮点型 2.2.4 字符串 2.2.5 数组 2.2.6 对象 2.2.7 资源 2.2.8 NULL 2.2.9 类型转换 2.3 变量 2.3.1 变量的赋值 2.3.2 预定义变量 2.3.3 变量作用域 2.3.4 可变变量 2.4 常量 2.4.1 自定义常量 2.4.2 魔术常量 2.5 表达式 2.6 运算符 2.6.1 算术运算符 2.6.2 字符串运算符 2.6.3 比较运算符 2.6.4 逻辑运算符 2.6.5 位运算符 2.6.6 赋值运算符 2.6.7 数组运算符 2.6.8 类型运算符 2.6.9 错误控制运算符 2.6.10 执行运算符 2.6.11 运算符的优先级 2.7 流程控制 2.7.1 if结构 2.7.2 switch结构 2.7.3 while循环 2.7.4 for循环 2.7.5 foreach语句 2.7.6 declare语句 2.7.7 exit和retunl语句 2.8 包含代码 2.9 本章小结 第3章 函数 3.1 用户自定义函数 3.1.1 函数调用与函数定义 3.1.2 递归函数 3.2 函数的参数 3.2.1 按值传递参数 3.2.2 通过引用传递 3.2.3 默认参数值 3.2.4 可变长度参数列表 3.3 函数返回值 第4章 类与对象 第5章 字符串 第6章 数组 第7章 PHP高级应用技术 第8章 PHP模板 第9章 MySQL快速入门 第10章 MySQL数据库管理 第11章 MySQL5进阶 第12章 文章发布系统 第13章 电子商务系统

70,040

社区成员

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

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