我正在尝试创建一个字符串数组并使用指针来修改它。我不确定如何声明指针,因为字符串的长度可能不同,我认为这是导致错误的原因。
我的代码看起来像这样:
#includes <string>
#includes <iostream>
using namespace std;
string *users = NULL;
int seatNum = NULL;
cin >> seatNum;
users = new string[seatNum];
string name;
cin >> name;
users[seatNum] = name;
当我尝试更改其值时,它会抛出写入访问冲突。从我读到的是因为字符串被编译为只读,所以我的问题是我将如何/我将如何更改它?易于理解的解释将是更可取的。
答案 0 :(得分:3)
您正在访问超出分配数组范围的内存
users = new string[seatNum];
users[seatNum] = name;
第一个元素是[0]。最后一个是[seatNum-1]
答案 1 :(得分:1)
您已创建了一个seatNum
元素数组。数组元素索引从0
开始,因此有效索引的范围是[0, seatNum - 1]
。通过访问users[seatNum] = ...
,您实际上已经过了数组的最后一个有效元素。这会调用UB(未定义的行为)。
我发现你已经正确选择使用std::string
而不是C风格的字符串。为什么不在数组上做出相同的选择?
#include <string>
#include <array>
#include <iostream>
int main(int, char*[]) {
int seatNum = 0;
std::cin >> seatNum;
std::vector<std::string> users(seatNum);
std::cin >> users[0];
return 0;
}
尽量避免使用指针和C风格的数组,尤其是动态数组。
答案 2 :(得分:0)
一些事情:
int seatNum将在堆栈上分配,永远不会为NULL。您应该将其设置为0.
您正在设置超出范围的用户[seatNum],导致程序崩溃。您 只能使用从0到seatNum-1的索引。
更新:Chris是正确的。我调查了它,字符串在C ++中确实是可变的。
答案 3 :(得分:0)
首先你不能为int类型的数据设置空值
int seatNum = NULL; // wrong
int seatNum = 0; // right
其次是从 0 到 Seatnum -1 的字符串边界
users[seatNum-1] = name; // right