C/C++中字符串数组在堆栈里是怎么分配的?高手请进

#include<iostream>#include<cstring>usingnamespacestd;intmain(){char*str[]={"中国","chin... #include<iostream>
#include<cstring>
using namespace std;
int main(){
char *str[]={"中国","china","江苏","Nanjing"};
int a[4] = {23,54,68,77};

我的问题是, str[]这个字符串数组 在内存中存在于哪?? 是不是str[0],str[2]等,这些在栈中,但是指向堆里面的 字符串“中国”“china”
而整型数组 就完全在栈中分配和初始化啊??
还有一个问题,堆和栈 他们 分别的地址 是递增还是递减的啊?

}
展开
 我来答
fuchuangbob
2009-09-28 · TA获得超过898个赞
知道小有建树答主
回答量:879
采纳率:0%
帮助的人:733万
展开全部
首先这个程序里没有变量是放在堆里面的.常量字符串的类型是const char *,放在全局静态区(初始化数据段,在程序中所有赋了初值的全局变量,存放在这里),char * a = "fffff",想改变a中字符串是错误的.
char * a[] = {"me","you"};
char * b[] = {"you","me"};
printf("%p %p",a[0],b[1]);
结果相同,均指向的是一个地址.str这个指针数组,里面的元素自然是在栈里.栈中数组都是连续的,堆中动态的内存也同样是连续的.需要注意的是,str中的连续是指的是str元素本身地址的连续,而不是内容的连续.
百度网友c4249ef
2009-09-28 · TA获得超过4867个赞
知道大有可为答主
回答量:1855
采纳率:0%
帮助的人:3223万
展开全部
额,楼上说对了,我把静态区和堆混了

堆是动态创建时候用到的内存

例如

int *p=new int[20];
则这些变量就是放在堆里的

初始化的串是放在静态区的
————————————————————————————
首先第一个问题,这些串是放在堆中的,你可以尝试修改
str[0][1]='A';
编译不会有问题,但执行会报错的

不是说字符串的就是在堆中,整形就是在栈里
而是因为str保存的是字符串常量

如果改成
char str[4][20]={"中国","china","江苏","Nanjing"};
str[0][1]='A';
就不会有错误了
因为str现在是在栈中保存的

地址递增还是递减存放,是要看系统的,我们一般用的,都是低位存放低位,高位存放高位,称为little endian,有的系统如IBM的power系列,是相反的,称为big endian
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幸巴达
2009-09-28 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6953
采纳率:38%
帮助的人:2463万
展开全部
char *str[]变量是在函数内部定义的,并且不是new的,所以肯定不是在堆里面的。
str的定义类似与
str[0] = "中国";
str[1] = "china";

"中国","china"这些都是静态的,是存放在静态区域的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hrlin2005
2009-09-28 · TA获得超过140个赞
知道答主
回答量:158
采纳率:0%
帮助的人:44.8万
展开全部
这问题和某种程序有关。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuzhun21
2009-09-28 · TA获得超过373个赞
知道答主
回答量:101
采纳率:0%
帮助的人:81.2万
展开全部
进来学习
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式