动态 C 字符串访问
dynamic C string access
可能的重复项:
修改 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 堆栈的唯一位置。
- 在qt创建器中调试时如何访问字符串变量的完整值?
- 当我用"ñ"字符循环访问字符串时出现奇怪的结果
- C++字符串问题-如何访问字符串元素
- C++/CLI访问字符串::来自非CLI代码的格式
- 循环访问字符串片段
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 关于在C++中访问字符串字母
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 访问字符串元素地址
- 循环访问字符串C++
- 嵌入式零件终端UB之后,正在访问字符串的部分
- 如何访问字符串的元素?
- 为什么通过string.h访问C++字符串类有效
- 循环访问字符串 C++ 中的行
- 如何使用 offset 运算符访问字符串的字符,并且字符串位于字符串向量中
- 如果我无法访问字符串变量,如何检查 NULL(空/0) 字符串
- 如何循环访问字符串中的每个字符
- C++ exc_bad_access从unordered_map中指向的对象访问字符串字段
- 循环访问字符串 (STL)
- 通过迭代器访问字符串向量中的字符