将指向数组的指针传递给函数时的分段错误(C ++)

时间:2016-11-21 09:12:56

标签: c++ arrays pointers segmentation-fault valgrind

我试图获取大量随机数,然后将该数组传递给一个函数,该函数将创建一个包含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

3 个答案:

答案 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状态(使用未初始化的值,这意味着指针和无效写入,这意味着写入指针恰好引用的位置):您不分配内存来将随机分数复制到arrBarrCarrNew中的applyScores()只是一个指针,因此无法存储数组。避免此类问题的最简单方法是使用标准库容器,如std::vectorstd::array,这些容器可以满足您的期望并避免手动内存管理。