主题:[讨论]数组的内存分配
			 jlujisu
				 [专家分:0]  发布于 2008-09-19 12:10:00
 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
liuluning [专家分:3340]  发布于 2008-09-20 09:11:00				
				注意两种定义的区别。
char *p="word";中,p被定义为一个指向字符串字面值常量"word"的指针。也就是说,指针p所指向的内存内容是一个常量,既然是常量,那么p所指的内容就不允许被改变。
							 
						
				板凳
				
					 jlujisu [专家分:0]  发布于 2008-09-20 12:28:00
jlujisu [专家分:0]  发布于 2008-09-20 12:28:00				
				
那为什么上面的数组a[0] 就可以改变呢
							 
						
				3 楼
				
					 liuluning [专家分:3340]  发布于 2008-09-20 21:42:00
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
vanehu [专家分:80]  发布于 2008-09-24 23:41:00				
				new就行了不new是不行的
							 
						
				5 楼
				
					 spacse [专家分:80]  发布于 2009-02-14 13:15:00
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
tanchuhan [专家分:15140]  发布于 2009-02-16 13:05:00				
				char a[] = "hello";
创建一个数组并把其内容初始化为"hello",然后,里面的内容当然任由你自己修改
char *p = "world";
创建一个指针并把其指向一个常量字符串区域,指针指向的东西当然不能被修改
							 
									
			
我来回复