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

时间:2016-10-11 07:48:33

标签: c++ arrays 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秒   按任意键继续。

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您需要为a 分配内存,否则程序的行为是 undefined 。写

int* a = new int[n];

当你完成所有工作时(<{1}}),

会选择delete[] a;

或者,使用return 0;并为您处理所有内存分配。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您的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];
}

这会照顾你的动态分配,这样你就不必自己做脏东西了。

答案 5 :(得分:0)

您的代码存在一些问题。主要是,您要求提供号码&#39; n&#39;然后需要分配足够的空间来存储那么多整数。

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

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

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

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

您也应该验证您的输入,例如,如果用户输入的内容不是整数,那么您的输入流(cin)将无效,并且原始&#39; n&#39;如果您要尝试创建该大小的向量,则应该是正数,并且您可能需要设置限制,否则您将遇到bad_alloc。如果你不介意痛苦bad_alloc,你应该抓住那个例外并打印一个错误,如&#34;没有足够的空间来分配尽可能多的数字&#34;。

当然,如果你输入一个像1000万这样的高数字,你可能会发现编译器可以分配那么多,但当你要求他输入1000万次整数时,你的用户会厌倦你的循环。

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