内存分配给数组的原则问题

Norris_Zhang 2006-08-12 10:27:43
#include < iostream.h >
#include < stdlib.h >
int main()
{
char str1[80];
char str2[4]={'G', 'o', 'o', 'd'};
cout << "请输入一行字符串:" << endl;
cin.getline(str1, 80);
cout << "str1=" << str1 << endl;
cout << "str2=" << str2 << endl;
system("PAUSE");
return 0;
}

输入:I am a student.
结果:
str1=I am a student.
str2=GoodI am a student.

原因是str2后面没有字符串结束标志'\0',程序把紧随其后的I am a student.也输出来了;

可是我就不明白为什么str1在内存中一定是接着str2后面呢?我改变str1[80]和str2[4]的赋值顺序,得到同样的结果,如果改变两个数组的定义顺序,就是先定义数组str2[4]后定义str1[80],则得到的结果是:
str1=I am a student.
str2=Good?(后面还有一个上下箭头的符号)
是什么意思?内存空间到底是按什么原则分配给数组的?
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Norris_Zhang 2006-08-13
  • 打赏
  • 举报
回复
是的,是没有找到'\0'
  • 打赏
  • 举报
回复
是没找到"/0"吧~
Norris_Zhang 2006-08-12
  • 打赏
  • 举报
回复
哈哈,明白了,谢谢两位,一会给分。
tailzhou 2006-08-12
  • 打赏
  • 举报
回复
char str2[4]={'G', 'o', 'o', 'd'};
数组的定义本身没什么问题;
没有规定char数组一定得是字符串;

另外str1,str2的存储顺序应该是跟编译器具体的实现有关.
lj860603 2006-08-12
  • 打赏
  • 举报
回复
随机分配还是连续分配?(
=====================
这个是随机分配的。但是数组的元素在空间上是连续的。
lj860603 2006-08-12
  • 打赏
  • 举报
回复
这不是奇怪的问题,只是不同编译器的处理方法可能不同而已。反正,字符数组结尾加'\0'是必须的!


那么内存是在定义变量时给变量分配地址还是在变量赋值时才分配地址?
===========================
这里是说定义,所以定义变量时就给变量分配地址,不是到赋值的时候才分配。
而如果说是声明,那么声明变量并没有分配给变量内存。
triace_zhang 2006-08-12
  • 打赏
  • 举报
回复
char str1[80];
char str2[4]={'G', 'o', 'o', 'd'};
不同编译器有不同的变量内存分配策略,一般情况下这两个变量数组的定义是连续的,则在栈中的内存段也是连续排列的。由于栈的后进先出原则,所以str2分配为低地址,str1分配为高地址,str1的首址紧接在str2的第四个char之后,str + 4 = str1,所以一般cout << str1,又str1没有\0,所以程序指针继续向后就到str2里了,在str2中找到'\0',程序指针跳到下一条语句。
Norris_Zhang 2006-08-12
  • 打赏
  • 举报
回复
这是书上的一道例题,目的就是让我们知道没有'\0'的后果,呵呵,可是书上没有指定编译器,可是他说的结果和我运行的一样,真奇怪。

那么内存是在定义变量时给变量分配地址还是在变量赋值时才分配地址?随机分配还是连续分配?(我指的是两个变量或两个数组,因为一个数组是连续的地址)
lj860603 2006-08-12
  • 打赏
  • 举报
回复
str1=I am a student.
str2=Good?(后面还有一个上下箭头的符号)
是什么意思?内存空间到底是按什么原则分配给数组的?
======================
至于打印str2后面出现什么内容,也就是一些垃圾内容了,因为数组没有以'\0'结尾。所以后面的内容都是未定义的。
分配给数组的是一段连续的内存空间。
lj860603 2006-08-12
  • 打赏
  • 举报
回复
char str2[4]={'G', 'o', 'o', 'd'};
//这个数组定义本身就有问题,字符数组最后应该加一个'\0'表示结束,不然,就要由编译器来决定该怎么处理了。
lj860603 2006-08-12
  • 打赏
  • 举报
回复
为什么str1在内存中一定是接着str2后面呢?
====================
这个应该是编译器问题,不必深究。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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