【问题标题】:Trying to read invalid data from array试图从数组中读取无效数据
【发布时间】:2021-03-19 07:03:11
【问题描述】:
#include<iostream>
#include<string>
#include<sstream>
#include <typeinfo>
using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    string str = "5 7 3";
    int length = str.length();
    char* arr = new char[length];
    cout << arr[2] << endl;
    /*
    int max = stoi(string(1, arr[0]));
    for (int i = 0; i < length; i++) {
        if(arr[i] != ' '){
            if (stoi(string(1, arr[i])) > max) {
                max = stoi(string(1, arr[i]));
            }
        }
    }
    cout << max << endl;
    */
    

delete[] arr;
}

我在尝试计算 arr[2] 时收到错误 C6385“读取无效数据”。例如,当我尝试计算 arr[0] 时,我在控制台中得到 char 'H',我真的不明白如果我的 str 中没有 H,为什么会有 'H'

【问题讨论】:

  • arr 为空。你在哪里填写任何类型的信息?
  • arr 是一个长度为 5 的 char 数组,但内容未知。 H 只是你当时记忆中的随机垃圾。
  • 为什么不应该是 H?使它不是 H 的部分在哪里?

标签: c++ arrays string memory


【解决方案1】:
char* arr = new char[length];
cout << arr[2] << endl;

这些是唯一对您的问题重要的行。第一个分配一个字符数组。该指针处存储在数组中的数据是未知的。它可能是零,也可能是完全的垃圾。在您的情况下,索引 2 中有时会出现“H”。如果您在一小时内运行它可能会有所不同 - 可能存储在该数组元素的内存地址的最后一个东西的 ascii 值为 H。

【讨论】:

    【解决方案2】:

    arr[] 不包含您的 str ,因为您没有为此发生任何事情。此外,为了适应 string 内容,您需要 new char[length + 1] 来说明终止零。

    毕竟,在大多数情况下,您不需要将字符串转换为数组,字符串已经包含 i。有std::stoi 函数可以处理字符串。

    【讨论】:

      【解决方案3】:
      char* arr = new char[length];
      

      这意味着,重新分配内存并调用它arr,它作为内存长度 char* 大小,这个内存可以包含另一个运行时变量或C++不可读的东西,所以当你尝试时:

      cout << arr[2] << endl;
      

      如果你能读懂它,它会给你那个值,如“H”,但如果你不能读它,它应该什么也没有或奇怪的图标。

      只需重新启动 PC,您的 arr[0] 上不会再出现一个“H”

      不管怎样,你的代码看起来你需要改变它:

      char* arr = new char[length];
      cout << arr[2] << endl;
      

      为:

      char* arr = new char[length + 1];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多