动态分配字符串数组,然后更改它的值?

时间:2013-11-26 02:25:38

标签: c++ arrays string dynamic-allocation

我正在尝试创建一个字符串数组并使用指针来修改它。我不确定如何声明指针,因为字符串的长度可能不同,我认为这是导致错误的原因。

我的代码看起来像这样:

#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;

当我尝试更改其值时,它会抛出写入访问冲突。从我读到的是因为字符串被编译为只读,所以我的问题是我将如何/我将如何更改它?易于理解的解释将是更可取的。

4 个答案:

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

一些事情:

  1. int seatNum将在堆栈上分配,永远不会为NULL。您应该将其设置为0.

  2. 您正在设置超出范围的用户[seatNum],导致程序崩溃。您 只能使用从0到seatNum-1的索引。

  3. 更新:Chris是正确的。我调查了它,字符串在C ++中确实是可变的。

答案 3 :(得分:0)

首先你不能为int类型的数据设置空值

int seatNum = NULL; // wrong 
int seatNum = 0;  // right

其次是从 0 到 Seatnum -1 的字符串边界

users[seatNum-1] = name; // right