【问题标题】:I'm getting a segmentation fault in GCC compiler我在 GCC 编译器中遇到分段错误
【发布时间】:2021-11-13 15:09:17
【问题描述】:

此函数出现分段错误:

#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

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

【问题讨论】:

  • “我在 GCC 编译器中遇到分段错误”——不,你不是。您在您的程序中遇到了分段错误,而不是在编译器中。

标签: arrays c segmentation-fault


【解决方案1】:

一般来说,定位分段错误源的最快方法是编译带有-g标志的程序,在可执行文件中包含调试信息,然后使用Valgrind运行程序。

在这种情况下,这里读取heap会出现分段错误:

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

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

也许你的意思是写while (con &gt; 0)?这会在con 为零时停止循环(而不是像以前那样为负数)。或者您可能需要不同的解决方案,具体取决于代码的预期功能。

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

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多