一、最近在练习char数组和char*的操作时,发现了一些区别:char *ch = "abc"和char ch[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。
#include <iostream>
using namespace std;
main()
{
char *ch1 = "abc";
char ch2[] = "abc";
char *ch3 = ( char* )malloc(3);
c3 = "abc";
printf("%d %d %s\n",&ch1,ch1,ch1);
printf("%d %d %s\n",&ch2,ch2,ch2);
printf("%d %d %s\n",&ch3,ch3,ch3);
}
其运行结果如下:
1441536 20600992 abc
1441524 1441524 abc
1441512 20600992 abc
从上面的结果,可以看出一些区别:
(1)、char *ch1 = "abc";字符指针变量ch1(在栈上分配)指向字符串常量"abc"首址,字符串常量存放数据区常量段,其数据不可修改,然后改变常量"abc"自然会崩溃;
(2)、char ch2[] = "abc" 该条语句执行字符串数组赋值操作,char ch2[]是一个数组,他的内容存在栈区可以修改;
二、下面我们来搞清楚编译程序的内存的分配形式: