深入分析 char * 和char []的区别
今天偶然发现对于char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确,于是在网上搜集了点资料,对堆和栈有了进一步的了解。
程序演示:
测试环境Devc++
代码
#include <iostream>
using namespace std;
main()
{
char *c1 = "abc";
char c2[] = "abc";
char *c3 = ( char* )malloc(3);
c3 = "abc";
printf("%d %d %s/n",&c1,c1,c1);
printf("%d %d %s/n",&c2,c2,c2);
printf("%d %d %s/n",&c3,c3,c3);
getchar();
}
输出:
2293628 4199056 abc
2293624 2293624 abc
2293620 4199056 abc
首先要搞清楚编译程序占用的内存的分区形式:
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放ÿ