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

Posted

技术标签:

【中文标题】将指向数组的指针传递给函数时出现分段错误(C++)【英文标题】:Segmentation fault when passing a pointer to an array into a function (C++) 【发布时间】:2016-11-21 09:12:55 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您将newArr 声明为指向int 的指针,但它没有指向任何地方。你可以像这样创建一个新数组:

int *newArr = new int[10];

但请记住在完成后删除数组:

delete[] arrB;
delete[] arrC;

或者您可以简单地将 std::vector&lt;int&gt; 用于您的数组 A、B 和 C(或至少 B 和 C)。

【讨论】:

【参考方案2】:

你永远不会为 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;

【讨论】:

【参考方案3】:

正如 valgrind 状态(使用未初始化的值,这意味着指针和无效写入,这意味着写入指针碰巧引用的位置):您没有分配内存来将随机分数复制到 arrB 和 @ 987654322@。 applyScores() 中的 arrNew 只是一个指针,所以它不能存储数组。避免此类问题的最简单方法是使用标准库容器,例如 std::vectorstd::array,它们可以满足您的期望并避免手动内存管理。

【讨论】:

以上是关于将指向数组的指针传递给函数时出现分段错误(C++)的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

使用指向指针 C++ 的指针时出现分段错误

在 C 中创建大型数组时出现分段错误

尝试使用指向 char* 的指针时出现总线错误 10 或分段错误 11,具体取决于封装

尝试从方法返回指向对象的指针时出现分段错误

分段错误将指针传递给函数