动态C字符串访问

时间:2013-01-31 10:26:21

标签: c++ c string

  

可能重复:
  Modifying a C string: access violation

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)谢谢。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

分配内存

char* str_2 = new char[7];

忽略之前的分配(并导致内存泄漏),并使str_2指向不可变字符串文字

str_2 = "string";

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

答案 2 :(得分:3)

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

更糟糕的是 - 在您的代码版本中,在您调用str_2的行中为new分配的内存存在内存泄漏。

答案 3 :(得分:1)

问题是你没有做任何"硬拷贝"在任何地方的内存单元格中,您只需将指针更改为指向不同的位置即可。字符串是数组,因此必须使用strcpy或memcpy函数进行复制。

char* str_2 = new char[7];分配动态内存。 str_2 = "string";使指针str_2指向一个完全不同的存储单元,忘记它曾经指向分配的动态存储器。由于没有对该内存的剩余引用,您知道内存泄漏的错误。

str_2现在指向常量字符串文字"字符串"它驻留在只读内存中。 str_2[2] = 'a';尝试修改该内存,这是未定义的行为并且您会崩溃。

要理解str_1案例的工作原理,掌握编程概念初始化赋值非常重要。 ' str_1'的情况因为你分配7个字节然后初始化那些字节以包含" string"而起作用。在变量初始化是唯一的地方=将导致来自只读内存的硬拷贝,其中实际的字符串文字"字符串"驻留在RAM中的堆栈,其中分配了str_1。