堆上数组与栈上数组的区别

来源:百度知道 编辑:UC知道 时间:2024/06/16 09:05:08
void main(){
char *s=new char[5];
s="abcd";
s[2]='y';
}执行时会有内存读写错误,但是改为:
void main(){
char s[]="abcd";
s[2]='y';
}却没有错误,我知道变量一个在堆区,一个在栈区,为什么会出现这个问题

关键是s="abcd"有问题,
char *s只是个指针而已,没有分配存储空间的,
而"abcd"是字符串常量,它是被储存在内存的静态区中的,静态区中的数据是不能被更改的,如果你强行修改静态区中的数据当然会报错了
char s[]="abcd"等于是你在栈中为s开辟了一个5字节的空间
等价于char s[5],所以这个时候你把一个字符s[2]='y'等于是把y放入了栈中,栈中的数据当然是允许被更改的

区别如下:
栈上数组由系统自动分配。
例如,声明在函数中一个局部变量。
int a; 系统自动在栈中为a开辟空间。
堆上数组:
需要程序员自己申请,并指明大小。
在c中malloc函数:
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意局部变量p1、p2
本身是在栈中的,但是指向的申请到的内存是在堆区。