动态 C 字符串访问

dynamic C string access

本文关键字:访问 字符串 动态      更新时间:2023-10-16

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

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

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

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

分配内存

char* str_2 = new char[7];

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

str_2 = "string";

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

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

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

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

要理解为什么str_1案例有效,掌握编程概念的初始化赋值非常重要。"str_1"的情况有效,因为您分配了 7 个字节,然后初始化这些字节以包含"字符串"。在变量初始化时,=会导致从实际字符串文本"字符串"所在的只读存储器到分配str_1的 RAM 堆栈的唯一位置。