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

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

本文关键字:打印 数组 出错 循环 cout      更新时间:2023-10-16
#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和第一个数字,程序就会崩溃,并显示以下消息

1

3

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

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

0xC0000005错误码在Windows下表示访问违规。在这种情况下,您正在尝试写入一些您无法访问的内存。

在你可以读或写内存之前,你需要分配内存。

如果你事先知道你将有多少项,你可以做静态内存分配,如果你不知道,那么你需要做动态内存分配。

例如,如果您知道最多只需要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);,所有的内存分配将为您处理。

Try: 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',然后需要分配足够的空间来存储这么多整数。

最好的方法是使用vector。您可以使用以下命令创建:

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

你也可以创建它,分配内存,但等待,直到你有数据:

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

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

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

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

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);
}