快速开始
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void main(){ char buf[]={'a','b','c','\0'}; char *p1 = "hello,world!"; char *p2 = (char*)malloc(100); strcpy(p2,"hello,world2!"); printf("%s\n",buf); printf("%s\n",p1); printf("%s\n",p2); }
|
以上代码输出结果:
1 2 3
| abc hello,world! hello,world2!
|
输出结果并没有什么区别,但是这里三个字符串却分别使用了三种不同类型的内存空间,第6行代码,申请了栈区的内存空间,并将字符a,b,c依次存到了所申请的内存空间。
第7行,在栈区申请了4个字节的内存空间(变量p1),并把p1指向字符串”hello,world!”所在的内存首地址。那么,”hello,world!”存在什么地方呢?答案是,存在了全局区。
第8行,在栈区分配了4个字节的内存空间(变量p2),在堆区分配了100个字节的空间,把p指向堆区空间的首地址,第9行,往堆区申请的内存空间拷贝了字符串”hello,world2!”
尝试改变三个字符串的其中一个字符,我们,发现,全局区的字符串不让修改,其它两个区的修改,没有问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void main(){ char buf[] ={'a','b','c','\0'}; char * p1 = "hello,world!"; char * p2 = (char *)malloc(100); strcpy(p2, "hello,world2!"); printf("%s\n", buf); printf("%s\n", p1); printf("%s\n", p2); printf("=================================\n"); buf[1] = 'd'; printf("%s\n", buf); //printf("=================================\n"); //p1[1]='d';//Segmentation fault //printf("%s\n",p1); printf("=================================\n"); p2[1] = 'd'; printf("%s\n", p2); }
|
我们可以看出,关于C语言的字符串,保存在不同的内存区,进行相同的操作,结果是不一样的,可以说,学习C语言的精髓,就是学习如何操作内存,随时明白自己当下在操作的内存区域的特点。后面我们将会陆续跟进内存四区的研究。