[英]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.