我有点困惑为什么以下事情会爆炸:
char* c = "Hello World!";
*c = 'h';
当我在堆上分配字符串时,它可以工作。所以我只是好奇我的初始版本有什么问题。
char* c = "Hello World!";
是指向通常存储在只读内存段中的字符串文字的指针。试图修改它是未定义的行为。指向诸如此类的字符串文字的指针应该更正确地定义为
const char *c = "Hello World!";
但const
经常省略(至少在 C 中)。
char* c = "Hello World!";
这c
是一个指向文字字符串的指针,因此您无法修改它
你可以改用这个
char c[] = "Hello World!";
*c = 'h',
c
这是一个 char 数组,包含字符串的字符,"Hello World!"
因此您可以对其进行修改。
您指向c
一个字符串文字,很可能存储在只读内存段中,您无法更改它。即使您可以根据 C 规范进行物理更改:
6.4.5(字符串文字)
如果程序尝试修改 [a string literal],则行为未定义。
如果您在堆(或堆栈)上分配内存,然后将字符串复制到该位置,则可以根据需要更改它。
像这样char * c = "Hello";
的字符串是字符串常量,并且存储在只读数据段中,因此您无法修改它们[但有些编译器确实允许这样做]
堆分配的字符串不在只读段中,因此可以自由修改。