覆盖c字符串时访问冲突

时间:2013-04-04 14:24:14

标签: c++ c

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

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

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

5 个答案:

答案 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";之类的字符串是字符串常量,存储在只读数据段中,因此您无法修改它们[但有些编译器允许这样做]

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