试图从数组中读取无效数据

Posted

技术标签:

【中文标题】试图从数组中读取无效数据【英文标题】: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 的部分在哪里? 【参考方案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];

【讨论】:

以上是关于试图从数组中读取无效数据的主要内容,如果未能解决你的问题,请参考以下文章

c#从数据库中读取图片出现参数无效

c#从数据库中读取图片出现参数无效

编写 SwiftUI 模型以从带有数组的 JSON 文件中读取

读取无效数据

从提供程序读取数据时发生错误。根据验证程序,远程证书无效

试图从网格中读取完整的数据源只是返回视图?