我在 GCC 编译器中遇到分段错误

I'm getting a segmentation fault in GCC compiler

此函数出现分段错误:

#include <stdio.h>
#include <stdlib.h>

int heap [999],heap2 [999]; 

int* addDigit(int *arr, int SIZE, int D) {
    int con=0;
    for (int i = 0; i < SIZE; i++)
        con = con * 10 + arr[i];
    con += D;

    int p = 0;
    while (con >= 0) {
        heap[p] = con % 10;
        con /= 10;
        p++;
    }

    for (int i = 0; i < p; i++) 
        printf("%d ", heap[i]);

    heap2[0] = 11;
    heap2[1] = -1;

    int *pp = heap2;

    return pp;
}

这是主要功能:

int main() {
    int N, digit; 
    scanf("%d", &N);
    int arr[N];
    for (int index = 0; index < N; index++) {
        scanf("%d", &arr[index]);
    }

    scanf("%d", &digit);
    int *ptr = addDigit(arr, N, digit);
    int index = 0;
    while (*(ptr+index) !=-1) {
        printf("%d", ptr[index]);
        index++;
    }

    return 0;
}

为什么我在这里遇到分段错误?

该程序获取数组输入,如 [1 2 3] 和值 k,比如 3; 它应该打印 1 2 6.

我在这里使用了两个全局声明的数组。

通常,定位段错误源的最快方法是使用 -g 标志编译程序以在可执行文件中包含调试信息,然后使用 运行 程序Valgrind.

此时在读取heap这里出现segmentation fault:

while (con >= 0)
{
    heap[p] = con % 10;
    con /= 10;
    p++;
}

变量con最终会变成0,并且会停留0,因为重复除以10。它不会变为负数,因此 while 循环将无限重复。索引 p 将增加,直到程序尝试访问 heap 的元素 999 - 这是越界,即这是一个分段错误。

也许你打算写 while (con > 0)?当 con 为零时(而不是像以前一样为负),这将停止循环。或者您可能需要不同的解决方案,具体取决于代码的预期功能。

PS。分段错误不会发生在“编译器中”,它会在程序执行时发生。