我已经阅读了有关分段错误的内容,但未能明白为什么应该由以下代码引起错误。
#include<iostream>
#include <stdlib.h>
using namespace std;
int main(){
int input;
cout << "Enter length of desired array." << "\n";
cin >> input;
int A [input];
//Populate and print the Array.
for(int i=0; i<sizeof(A); i++){
A[i] = rand()%99;
cout << A[i] << " ";
}
return 0;
}
答案 0 :(得分:8)
sizeof
为您提供字节大小。要查找元素计数,请将数组大小除以元素的大小:
for(int i=0; i < sizeof(A) / sizeof(A[0]); i++)
你正在做的事情是在整个过程中写入3次(在大多数系统上)数组的大小,这会导致段错误。
答案 1 :(得分:3)
这里有几个问题:
sizeof(A)
以字节为单位返回大小,而不是元素数。因此,您正在超越阵列。你需要将它除以每个元素的大小。您应该将循环更改为:
for(int i=0; i < input; i++){
编辑:这是一个不使用可变长度数组的解决方案:
int main(){
int input;
cout << "Enter length of desired array." << "\n";
cin >> input;
int *A = new int[input]; // Allocate
//Populate and print the Array.
for(int i=0; i<sizeof(A); i++){
A[i] = rand()%99;
cout << A[i] << " ";
}
delete[] A; // Free the allocated memory
return 0;
}
答案 2 :(得分:1)
你甚至不应该使用数组。
std::vector<T>
有一个构造函数vector(size_t n)
,可以创建n
个元素。
答案 3 :(得分:0)
sizeof
运算符以sizeof(char)
的倍数返回其参数的大小。在您的平台上,int
大于char
,因此您走出数组的末尾并且未定义(读取非常糟糕)当您执行时去做。很高兴这只是一个错误。
答案 4 :(得分:0)
您不应该将new
和delete
关键字用于动态内存。我很惊讶这个编译因为输入不是常量。
答案 5 :(得分:0)
要拥有可变长度的数组int A [input];
,你必须以恐怖的方式分配它:
在C中:
<{1}}在你完成时记得int A* = malloc(input * sizeof(int));
。
在C ++中:
<{1}}在你完成时记得free(A);
。