C语言字符串数组的使用需要分配内存吗

char *p[5];定义这样一个字符串数组系统会自动为它分配内存吗?
系统是自动给这个数组分配内存还是也可以为其中的5个字符串分配内存?
当定义一个变量如int a,时系统会自动为其分配内存,定义一个字符串呢?
char *str;系统又是怎样为其分配内存的呢?

#include <iostream>
#include <string>
using namespace std;

int main(){
char* p[5] = {
"test1",
"test2",
"test3",
"test4",
"test5"
};
//"test1"...以及其他5个字符串实际上为字符串常量,它们储存在静态存储区,而我们定义的char *p[]实际上相当于是5个地址指针,并分别被赋值上面5个字符串常量的地址

cout<<"sizeof(p) "<<sizeof(p)<<endl; // 因为p为5个字符指针数组,所以它的大小应该是4(地址占用4个字节内存)*5=20字节

cout<<"long(p) "<<hex<<long(p)<<endl; //p代表字符串数组第一个p[0]所在地址,在下面将会看到与&p[0]地址相同

cout<<"sizeof(p[0]) "<<sizeof(p[0])<<endl; // 4个字节,同样存的为字符串常量所在地址
cout<<"long(p[0]) "<<hex<<long(p[0])<<endl; // 打出p[0]内储存的字符串常量地址
cout<<"long(&p[0]) "<<hex<<long(&p[0])<<endl; // 指针本身地址,可以看到结果与上面的地址不同,说明既给字符串分配了内存,又给指针数组分配了内存,而且可以从运行结果看出分配内存时分别分配了不同的地方,字符串常量是保存在数据段(只读),而字符串指针保存在堆栈段

}

//另外char *str分配与char *p[5]类似,只不过不是数组而已。
//但如果定义char c[] = "abcde";这时只会分配c[]数组,不会令分配内存给字符串"abcde",而且c[]分配内存在堆栈段

运行结果:
sizeof(p) 20
long(p) bfa8cf5c
sizeof(p[0]) 4
long(p[0]) 8048aa4
long(&p[0]) bfa8cf5c

使用gcc 版本 4.4.2 20091027 (Red Hat 4.4.2-7) (GCC)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-10
char *p[5];
为指针数组,系统为其分配5 x 4字节内存,每指针占用4字节内存
int a;
系统为其分配4字节指针,因为整型占用4字节内存
char* str;
为一字符串指针,系统为其分配4字节指针,因为指针占用4字节内存
char str[30];
为字符串定义,也可以理解为字符数组,为连续的30字节内存分配

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网