将指向数组的指针传递给函数时出现分段错误 (C++)
Segmentation fault when passing a pointer to an array into a function (C++)
我正在尝试获取一个大型随机数数组,然后将该数组传递给一个函数,该函数将创建一个包含 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 的帮助下答案微不足道,请原谅我。
valgrind error log screenshot
你永远不会为 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;
}
您将 newArr
声明为指向 int
的指针,但它指向任何地方。您可以像这样创建一个新数组:
int *newArr = new int[10];
但记得用完后删除数组:
delete[] arrB;
delete[] arrC;
或者您可以简单地对数组 A、B 和 C(或至少 B 和 C)使用 std::vector<int>
。
如 valgrind 所述(使用未初始化的值,这意味着指针和无效写入,这意味着写入指针恰好指向的位置):您不分配内存来将随机分数复制到 arrB
和 arrC
。 applyScores()
中的arrNew
只是一个指针,不能存放数组。避免此类问题的最简单方法是使用标准库容器,如 std::vector
或 std::array
,它们可以满足您的预期并避免手动内存管理。
我正在尝试获取一个大型随机数数组,然后将该数组传递给一个函数,该函数将创建一个包含 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 的帮助下答案微不足道,请原谅我。
valgrind error log screenshot
你永远不会为 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;
}
您将 newArr
声明为指向 int
的指针,但它指向任何地方。您可以像这样创建一个新数组:
int *newArr = new int[10];
但记得用完后删除数组:
delete[] arrB;
delete[] arrC;
或者您可以简单地对数组 A、B 和 C(或至少 B 和 C)使用 std::vector<int>
。
如 valgrind 所述(使用未初始化的值,这意味着指针和无效写入,这意味着写入指针恰好指向的位置):您不分配内存来将随机分数复制到 arrB
和 arrC
。 applyScores()
中的arrNew
只是一个指针,不能存放数组。避免此类问题的最简单方法是使用标准库容器,如 std::vector
或 std::array
,它们可以满足您的预期并避免手动内存管理。