繁体   English   中英

尝试使用 cout 在循环中打印出数组时出错

[英]Error when trying to print out array in a loop using cout

#include <cstdio>
#include <iostream>

int main (){
    int n;
    std::cin>>n;
    int*a;
    for (int i=0;i<n;i++){
        std::cin>>a[i];
    }
    for(int i=0;i<n;i++){
        std::cout<<a[i];
    }

    return 0;
}

我刚刚开始解决一个问题,我想检查我是否知道如何读取和排列并制作示例输出数组。 当我包含第二个循环程序时,只要输入 n 和第一个数字,程序就会崩溃并显示以下消息

3 1

进程返回 -1073741819 (0xC0000005) 执行时间:4.943 s 按任意键继续。

int *a; 是一个指向整数的指针,它只是一个指向某个内存的指针,它自己没有分配内存。 由于您在没有先设置它的情况下取消引用这个指针a[i] ,您的编译器甚至应该给您一些警告,告诉您您正在使用一个尚未初始化的变量。

Windows 中的0xC0000005错误代码表示访问冲突。 在这种情况下,您正在尝试写入一些您无权访问的内存。

您需要先分配内存,然后才能对其进行读取或写入。

如果您事先知道将有多少条目,则可以进行静态内存分配,如果不知道,则需要进行动态内存分配。

例如,如果您知道最多只需要 20 个条目,则可以轻松交换int *a; 对于int a[20]; .

但是由于您只知道程序运行时会有多少条目,那么您需要进行动态内存分配: int *a = new int[n]; .

所以你的代码应该是

#include <cstdio>
#include <iostream>

int main (){
    int n;
    std::cin>>n;
    int *a = new int[n];
    for (int i=0;i<n;i++){
        std::cin>>a[i];
    }
    for(int i=0;i<n;i++){
        std::cout<<a[i];
    }
    delete[] a; // Release allocated memory.
    return 0;
}

您需要为a分配内存,否则程序的行为是未定义的 写作

int* a = new int[n];

将它,然后是delete[] a; 当你全部完成后(把它放在return 0;之前)。

或者,使用std::vector<int> a(n); 并且所有的内存分配都会为您处理。

int*是指向 int 的指针,而不是数组。
要创建一个int数组,例如: int a[100]; - 其中 100 是大小

此外,您应该使用std::vector<int>代替:

vector<int> vec;
for (int i = 0; i != n; ++i) {
    int temp;
    cin >> temp;
    vec.emplace_back(temp);
}

尝试:int a[20]; 而不是 int *a;

你的a没有指向任何有效的内存,导致未定义的行为。

你需要的是一个std::vector

#include <vector>
int n;
std::cin>>n;
std::vector<int> numbers;
for (int i=0;i<n;i++){
    int val;
    std::cin>>val;
    numbers.push_back(val);
}
for(int i=0;i<n /* or numbers.size()*/ ;i++){
    std::cout<< numbers[i];
}

这会为您处理动态分配,这样您就不必自己做脏事。

您的代码存在一些问题。 首先,您请求数字“n”,然后需要分配足够的空间来存储这么多整数。

最好的方法是使用矢量。 您可以使用以下方法创建它:

std::vector< int > numbers( n );

您还可以创建它来分配内存,但要等到有数据为止:

std::vector< int > numbers;
numbers.reserve( n );

您可能还应该验证您的输入,例如,如果用户输入的内容不是整数,则您的输入流 (cin) 将无效,如果您要尝试创建一个向量,则原始 'n' 应该是正数那个大小,你可能需要设置一个限制,否则你会遇到bad_alloc 如果您不介意遇到bad_alloc您应该捕获该异常并打印一个错误,例如“没有足够的空间来分配尽可能多的数字”。

当然,如果你输入一个很大的数字,比如 1000 万,你可能会发现编译器能够分配这么多,但是当你要求他输入 1000 万次整数时,你的用户会在你的循环中感到无聊。

您不需要<cstdio>作为标题。 您将需要<vector><iostream>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM