0

可能重复:
修改 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)谢谢。

4

4 回答 4

3

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

于 2013-01-31T10:27:28.193 回答
3

分配内存

char* str_2 = new char[7];

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

str_2 = "string";

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

于 2013-01-31T10:27:44.447 回答
3

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

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

于 2013-01-31T10:28:12.990 回答
1

问题是您不会在任何地方对内存单元进行任何“硬拷贝”,您只需将指针更改为指向不同的位置。字符串是数组,因此必须使用 strcpy 或 memcpy 函数进行复制。

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

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

要理解 str_1 案例为何有效,掌握编程概念intializationassignment很重要。'str_1' 的情况有效,因为您分配了 7 个字节,然后将这些字节初始化为包含“字符串”。变量初始化是唯一=会导致从实际字符串文字“字符串”所在的只读内存硬拷贝到 RAM 中分配 str_1 的堆栈的地方。

于 2013-01-31T10:37:44.777 回答