我试图获取大量随机数,然后将该数组传递给一个函数,该函数将创建一个包含10个元素的新数组,其值与大数组中的值相对应。我将参数 start 传递给函数,以指示大数组的索引,我将从中开始将值复制到较小的数组中。
如果我的解释不清楚,我有一个20个随机生成数字的数组A:
A = {1,2,3,...... 20}
我想制作一个包含前10个数字的数组B:
B = {1,2,3,...... 10}
和保持第二个10的数组C. C = {11,12,13,...... 20}
我能够生成随机数并使用for循环显示它们,但是一旦我开始尝试制作新数组,我会在终端中出现分段错误:
分段错误(核心转储)
以下是我的代码。
int main() {
int size = 20;
int *arrA = getRandomScores(size);
int *arrB = applyScores(arrA, 0);
int *arrC = applyScores(arrA, 10);
for(int i = 0; i < 10; i++) {
cout << arrB[i] << endl;
}
cout << endl << endl;
for(int i = 0; i < 10; i++) {
cout << arrC[i] << endl;
}
return 0;
}
int *applyScores(int *arr, int start) {
int *newArr;
for(int i = 0; i < 10; i++) {
newArr[i] = arr[start];
start++;
}
return newArr;
}
int *getRandomScores(int size) {
int *arr;
//return null if size is zero or negative
if (size <= 0)
return NULL;
//dynamically allocate the array
arr = new int[size];
//seed the random number generator
srand(time(0));
//populate the array with random numbers
for(int i = 0; i < size; i++)
arr[i] = rand() % 100;
return arr;
}
我在linux上,所以我被告知使用valgrind查看更详细的错误消息。以下是valgrind给我的。这是我第一次遇到分段错误,所以请原谅我,如果在valgrind的帮助下答案是微不足道的。
答案 0 :(得分:3)
您将newArr
声明为指向int
的指针,但它无处可指。你可以创建一个像这样的新数组:
int *newArr = new int[10];
但请记住在完成后删除数组:
delete[] arrB;
delete[] arrC;
或者您只需将std::vector<int>
用于阵列A,B和C(或至少B和C)。
答案 1 :(得分:1)
你永远不会为B和C分配内存
int *applyScores(int *arr, int start) {
int *newArr = new int[10];
for(int i = 0; i < 10; i++) {
newArr[i] = arr[start];
start++;
}
return newArr;
}
答案 2 :(得分:1)
作为valgrind状态(使用未初始化的值,这意味着指针和无效写入,这意味着写入指针恰好引用的位置):您不分配内存来将随机分数复制到arrB
和arrC
。 arrNew
中的applyScores()
只是一个指针,因此无法存储数组。避免此类问题的最简单方法是使用标准库容器,如std::vector
或std::array
,这些容器可以满足您的期望并避免手动内存管理。