主题:[讨论]数组的内存分配
jlujisu
[专家分:0] 发布于 2008-09-19 12:10:00
数组可以在静态存储区和栈中创建,为什么不能在堆中呢?
char a[]="hello";
a[0]='X';
char *p="world";
p[0]='X'; //为什么出错了?
回复列表 (共6个回复)
沙发
liuluning [专家分:3340] 发布于 2008-09-20 09:11:00
注意两种定义的区别。
char *p="word";中,p被定义为一个指向字符串字面值常量"word"的指针。也就是说,指针p所指向的内存内容是一个常量,既然是常量,那么p所指的内容就不允许被改变。
板凳
jlujisu [专家分:0] 发布于 2008-09-20 12:28:00
那为什么上面的数组a[0] 就可以改变呢
3 楼
liuluning [专家分:3340] 发布于 2008-09-20 21:42:00
char a[]="hello";这种写法是定义一个字符型数组变量,这样a中的每个字符当然是可以改变的。
char *p="hello";这种写法是在内存的常量区内分配了一个字符串常量"hello",然后定义了一个字符型指针变量p,让它指向这个常量区的首地址。虽然指针p本身是个变量,可以改变指向,但无论怎样变,常量区域的内容是不能改变的。
4 楼
vanehu [专家分:80] 发布于 2008-09-24 23:41:00
new就行了不new是不行的
5 楼
spacse [专家分:80] 发布于 2009-02-14 13:15:00
数组要么在静态存储区被创建(全局数据),要么在栈上被创建,数组名对应一块内存,其地址与容量在生命其内保持不变,只有数组内容可以被改变.
指针可以随时指向任意类型内存块.
a[0]='X';//数据内容可以改变
p[0]='X'; //出错
因为char *p="world";表示p指向常量字符串"world"(位于静态存储区),常量字符串的内容是不能被修改的.
6 楼
tanchuhan [专家分:15140] 发布于 2009-02-16 13:05:00
char a[] = "hello";
创建一个数组并把其内容初始化为"hello",然后,里面的内容当然任由你自己修改
char *p = "world";
创建一个指针并把其指向一个常量字符串区域,指针指向的东西当然不能被修改
我来回复