我有点困惑为什么以下爆炸:
char* c = "Hello World!";
*c = 'h';
当我在堆上分配字符串时,它可以工作。所以我只是好奇我的初始版本有什么问题。
答案 0 :(得分:6)
char* c = "Hello World!";
是指向字符串文字的指针,通常存储在只读内存段中。试图修改它是未定义的行为。像这样的字符串文字的指针应该更恰当地定义为
const char *c = "Hello World!";
但const
经常被省略(至少在C中)。
答案 1 :(得分:3)
char* c = "Hello World!";
此处c
是一个指向文字字符串的指针,因此您无法对其进行修改
您可以改用
char c[] = "Hello World!";
*c = 'h',
c
这里是一个char数组,包含字符串"Hello World!"
的字符,因此您可以修改它。
答案 2 :(得分:3)
您将c
指向字符串文字,很可能存储在只读内存段中,您无法更改它。即使你可以进行物理改变,按照C规范:
6.4.5(字符串文字)
如果程序试图修改[字符串文字],则行为未定义。
如果在堆(或堆栈)上分配内存,然后将字符串复制到该位置,则可以根据需要进行更改。
答案 3 :(得分:2)
修改字符串文字是undefined behaviour。主要原因是允许编译器将"Hello World!"
放在只读存储器中。
另一方面,以下情况很好:
char c[] = "Hello World!";
*c = 'h';
答案 4 :(得分:-1)
char * c = "Hello";
之类的字符串是字符串常量,存储在只读数据段中,因此您无法修改它们[但有些编译器允许这样做]
堆分配的字符串不在只读段中,因此可以自由修改。