字符串数组在内存中的存储位置?

sinat_29353103 2015-09-17 08:16:58
[size=13px]程序:
int main(){
char str[] = "hello";
char str2[10];
scanf("%s",str);
}

为什么str与str2指向相同的位置,比如输入abcdefghij
str的值就为abcde
str2就为abcdefghij

求大神不吝赐教
...全文
550 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingween 2015-09-19
  • 打赏
  • 举报
回复
1、首先str和str2不可能指向相同的地址。楼主请确定。 2、str2的地址比str低10位。两者的地址是连在一起的。我是在linux环境下gcc编译的。 3、str的大小为sizeof("hello")=6;所以楼主输入一个字符串给str时,不应该输入大于6的字符串,不然会产生段错误。 4、根据我的实验,str2有10个字节,并且未初始化。所以当你puts (str2)显示str2 的内容时,会出现以下情况: a. 如果str2中的10的char 中的内容有‘\0’的ASCII码值,即为0,则会显示长度小于10的乱码。 b.. 如果str2中的10的char 中的内容没有‘\0’的ASCII码值,则会显示10个乱码+str显示的内容。 请注意:字符串输出是以’\0‘为结束的。字符串输入是默认加上'\0'的。
xian_wwq 2015-09-18
  • 打赏
  • 举报
回复
同意3楼, 对于字符串的相关操作,推荐使用scanf_s,gets_s等 如果没有长度约束,就会一直向后找"\0",很多时候就越界了
lm_whales 2015-09-18
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
你这个例子里,编译器安排 str2,在低地址,str在高地址(不是任何时候,任何编译器都这么做的) 二者邻接 ,当输入越界的时候 后面的字符恰好输入到str中了 于是就成为你看到的样子。
抱歉,高低反了str低,str2 高
lm_whales 2015-09-18
  • 打赏
  • 举报
回复
你这个例子里,编译器安排 str2,在低地址,str在高地址(不是任何时候,任何编译器都这么做的) 二者邻接 ,当输入越界的时候 后面的字符恰好输入到str中了 于是就成为你看到的样子。
lm_whales 2015-09-18
  • 打赏
  • 举报
回复
scanf 某些时候很不靠谱,gets 函数也是, 对于输入字符串, 只要用户输入,它就会全部输入到对应的字符数组中 从来不考虑输入会溢出 解决方案,微软等给出了 scanf_s,gets_s等函数,只能输入一定长度的字符串,多余的不在输入到字符数组中。 自己做的话,直接按需读取字符,放到数组中
qq_30446977 2015-09-17
  • 打赏
  • 举报
回复
基本字符串认识。 当你char str[] = "hello";对str进行初始化的时候,编译器认为str包括6个字节。而str2包括11个字节。 str读入是5个(加\0),而str2读入是10个。 你这里没懂就是因为没懂初始化的规则。
mymtom 2015-09-17
  • 打赏
  • 举报
回复
越界了,结果是不确定的。

69,335

社区成员

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

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