char * s1 = "abcd";
s1[0] = 'm';//segment fault
上面代码在gcc下编译运行将报段错误。
然而,
char s1[] = "abcd";
s1[0] = 'm';
这段代码则能够正确运行。其中包含的原理是char* 和 char[],在内存分配上的机制差异。
对于char * s = "abcd";来说, 编译器会将字符串字面量当作常量数据处理,存放在.rodata段,这样以来,s将指向.rodata段中的某处内存,
因此对该段内存的修改会引起段错误。(另,printf等格式化字符串函数中的format string 如"%d"等也会被放在.rodata中。)
对于char s1[] = "abcd";来说,"abcd"是在栈上分配内存,使用mov指令直接将值写入栈上对应内存。
使用下面代码来验证上面的描述:
#include <stdio.h>
int main()
{
char * s1 = "abcd";
char s2[] = "efghef";
}
查看汇编指令:
cString.o: file format