如果你对这个问题嗤之以鼻,至少告诉我为什么这样我可以在将来提出更好的问题。
#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秒 按任意键继续。
答案 0 :(得分:1)
int *a;
是一个指向整数的指针,它只是指向某个内存的指针,它没有自己分配的内存。由于您在不首先设置它的情况下取消引用此指针a[i]
,因此您的编译器甚至应该给出一些警告,告诉您正在使用尚未初始化的变量。
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];
会选择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>
。