2013-01-31 26 views
0

可能重复:
Modifying a C string: access violation动态C字符串访问

int main() 
    { 
     char str_1[7] = "string"; 
     char* str_2 = new char[7]; 
     str_2 = "string"; 
     str_1[2] = 'a'; //ok 
     str_2[2] = 'a'; //error 

     return 0; 
    } 

我得到 “访问冲突” 错误这里str_2[2] = 'a'; 我不明白为什么我不能访问动态字符串通过索引在这里(VS2010)谢谢。

+2

必须有很多这个重复。 – hmjd

+0

任何你不使用'std :: string'的原因? – chris

+0

只是试验 –

回答

3

你不能像你那样分配给一个字符串。您不需要复制字符串内容,而是复制指针。因此str_2现在指向一个字符串文字,并且不能被修改。要复制字符串的内容,请使用strcpy

在你的代码版本甚至worse-存在在那里你调用了new行分配给str_2内存内存泄漏。

3

而不是str_2 = "string";strcpy(str_2, "string"),因为在你的情况下,你正试图修改字符串文字。

3

分配内存

char* str_2 = new char[7]; 

忽略以前的分配(并导致内存泄漏),并使得str_2点到不变的字符串字面

str_2 = "string"; 

str_2现在将实际点到const char[],隐式转换为char*只是为了向后兼容。实际上它指向只读内存。

1

问题是,你不会对任何地方的内存单元做任何“硬拷贝”,你只要改变指针指向不同的地方。字符串是数组,因此必须使用strcpy或memcpy函数进行复制。

char* str_2 = new char[7];分配动态存储器。 str_2 = "string";让指针str_2指向一个完全不同的存储单元,忘记它用来指向分配的动态存储器。由于没有剩余的内存引用,因此您知道内存泄漏问题。

str_2现在指向在驻留在只读存储器中的恒定字符串文字“串”。 str_2[2] = 'a';尝试修改该内存,这是未定义的行为,并且会导致崩溃。

要理解为什么str_1情况下工作,它掌握的编程概念intialization分配是很重要的。 'str_1'的情况是可行的,因为您分配了7个字节,然后初始化这些字节以包含“字符串”。在变量初始化中,=将会从实际的字符串字符串“string”所在的只读存储器到分配了str_1的RAM中的堆栈中产生硬拷贝。