今天回顾C的时候遇到了一个问题:
char a[] = "hello";
char * b = "hello";
a[2] = 'r';
b[2] = 'r';
会发现报错,上述程序编译没有问题,但是运行时弹出SIGSEGV。此例中,”hello”作为一个常量字符串,在编译后会被放在.rodata节(GCC),最后链接生成目标程序时.rodata节会被合并到text segment与代码段放在一起,故其所处内存区域是只读的。这就是错误的访问类型引起的SIGSEGV。
再次查询资料后:
字符数组可以以下面这种形式进行初始化:
char message[] = { 'H', 'e', 'l', 'l', ,'0', '0' };
这个方法当然可行。但除了非常短的字符串,这种方法确实很笨拙。因此,C语言标准提供了一种快速方法用于初始化字符数组:
char message[] = "hello";
尽管它看上去像是一个字符串常量,实际上并不是。它只是前例的初始化列表的另一种写法。
它们是根据它们所处的上下文环境进行区分的。
- 当用于初始化个字符数组时,它就是一个初始化列表。
- 在其他任何地方,它都表示一个字符串常量。
这里有一个例子:
char message1[] = "Hello";
char * message2 = "Hello";
这两个初始化看上去很像,但它们具有不同的含义。前者初始化一个字符数组的元素,而后者则是一个真正的字符串常量。这个指针变量被初始化为指向这个字符串常量的存储位置,如下图所示:
参考链接
[1] https://blog.csdn.net/u010150046/article/details/77775114;
[2] Kenneth A.Reek 《C与指针》;