【问题标题】:Dynamically allocated string array, then change it's value?动态分配的字符串数组,然后改变它的值?
【发布时间】:2013-12-11 00:35:48
【问题描述】:

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

我的代码如下所示:

#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]; 创建一个从0seatNum - 1 索引的字符串数组,因此users[seatNum] 访问超出了数组的边界。

标签: c++ arrays string dynamic-allocation


【解决方案1】:

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

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

其次是从0到seatnum -1的字符串范围

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

【讨论】:

    【解决方案2】:

    一些事情:

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

    2. 您设置的 users[seatNum] 越界导致程序崩溃。你 只能使用从 0 到 seatNum-1 的索引。

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

    【讨论】:

    • 最后一点并不正确。字符串在 C++ 中是可变的,因此没有理由创建副本。它只是修改有问题的对象。这是否意味着对包含的字符进行深度复制各不相同。
    【解决方案3】:

    您已经创建了一个 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 样式数组,尤其是动态数组。

    【讨论】:

      【解决方案4】:

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

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

      第一个元素是 [0]。最后一个是[seatNum-1]

      【讨论】:

      • Doh,我不知道我怎么能忽略这么简单的事情。有时我想你只需要问别人,还是谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2020-12-09
      • 2011-10-21
      • 2013-03-09
      • 2017-10-23
      相关资源
      最近更新 更多