0

我有点困惑为什么以下事情会爆炸:

char* c = "Hello World!";
*c = 'h';

当我在堆上分配字符串时,它可以工作。所以我只是好奇我的初始版本有什么问题。

4

5 回答 5

6

char* c = "Hello World!";是指向通常存储在只读内存段中的字符串文字的指针。试图修改它是未定义的行为。指向诸如此类的字符串文字的指针应该更正确地定义为

const char *c = "Hello World!";

const经常省略(至少在 C 中)。

于 2013-04-04T14:25:29.787 回答
3
char* c = "Hello World!";

c是一个指向文字字符串的指针,因此您无法修改它

你可以改用这个

char c[] = "Hello World!";
*c = 'h',

c这是一个 char 数组,包含字符串的字符,"Hello World!"因此您可以对其进行修改。

于 2013-04-04T14:25:16.327 回答
3

您指向c一个字符串文字,很可能存储在只读内存段中,您无法更改它。即使您可以根据 C 规范进行物理更改:

6.4.5(字符串文字)

如果程序尝试修改 [a string literal],则行为未定义。

如果您在堆(或堆栈)上分配内存,然后将字符串复制到该位置,则可以根据需要更改它。

于 2013-04-04T14:25:57.917 回答
2

修改字符串文字是未定义的行为。主要原因是编译器被允许放置"Hello World!"在只读内存中。

另一方面,以下是好的:

char c[] = "Hello World!";
*c = 'h';
于 2013-04-04T14:25:16.260 回答
-1

像这样char * c = "Hello";的字符串是字符串常量,并且存储在只读数据段中,因此您无法修改它们[但有些编译器确实允许这样做]

堆分配的字符串不在只读段中,因此可以自由修改。

于 2013-04-04T14:27:34.823 回答