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

来源:百度知道 编辑:UC知道 时间:2024/05/05 11:21:46
#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”
而整型数组 就完全在栈中分配和初始化啊??
还有一个问题,堆和栈 他们 分别的地址 是递增还是递减的啊?

}

首先这个程序里没有变量是放在堆里面的.常量字符串的类型是const char *,放在全局静态区(初始化数据段,在程序中所有赋了初值的全局变量,存放在这里),char * a = "fffff",想改变a中字符串是错误的.
char * a[] = {"me","you"};
char * b[] = {"you","me"};
printf("%p %p",a[0],b[1]);
结果相同,均指向的是一个地址.str这个指针数组,里面的元素自然是在栈里.栈中数组都是连续的,堆中动态的内存也同样是连续的.需要注意的是,str中的连续是指的是str元素本身地址的连续,而不是内容的连续.

额,楼上说对了,我把静态区和堆混了

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

例如

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

char *str[]变量是在函数内部定义的,并且不是new的,所以肯定不是在