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