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

Dynamically allocated string array, then change it's value?

本文关键字:然后 字符串 数组 动态分配      更新时间:2023-10-16

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

我的代码看起来像这样:

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

当我试图更改其值时,它会引发写入访问冲突。从我所读到的内容来看,这是因为字符串被编译为只读的,所以我的问题是我该如何更改它?易于理解的解释会更好。

您访问的内存超出了分配的数组的范围

users = new string[seatNum];
users[seatNum] = name;

第一个元素是[0]。最后一个是[seatNum-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样式数组,尤其是动态数组。

几件事:

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

  2. 您设置的用户[seatNum]超出了限制,导致程序崩溃。你只能使用从0到seatNum-1的索引。

更新:Chris是正确的。我研究了一下,字符串在C++中确实是可变的。

首先,不能将null值设置为int类型数据

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

从0到seatnum-1 的第二个字符串边界

users[seatNum-1] = name; // right
相关文章: