【问题标题】:segmentation fault in C and recursion functionC和递归函数中的分段错误
【发布时间】:2016-01-14 05:39:11
【问题描述】:

此代码可以运行,但某些编译器会引发分段错误。如果我注释掉sumNumber,则不会发生错误。

int sumNumber(int array[], int k);


int main(void) {

        int n;
        static int num[MAX];

        int k;

        scanf("%d", &n);
        scanf("%d", &k);


        for(int i = 0; i < n; i++){
            scanf("%d", &num[i]);
        }

        quick_sort(num,0,n-1);
        printf("%d\n",sumNumber(num,k-1));

      return 0;
    }

int sumNumber(int array[],int k){


    if(k < 0){
        return 0;
    }
    return (array[k] + sumNumber(array,k-1));
}

【问题讨论】:

  • 听起来像stack overflow
  • quick_sort 中可能存在错误。滥用指针可能会留下定时炸弹,直到其他代码运行为止。
  • 为什么需要对数组进行排序?加法是关联和交换的,所以顺序无关紧要。
  • 没有我没有的quick_sort(),这工作得很好,但我想知道你为什么要传递给quicksort() 参数0n-1。如果数组有 1 个元素,当告诉元素大小为 0 或没有元素时,quick_sort() 是否表现良好?

标签: c recursion segmentation-fault


【解决方案1】:

我可以帮忙。

我在看:

printf("%d\n",sumNumber(num,k-1));

我正在看:

int sumNumber(int array[],int k){


if(k < 0){
    return 0;
}
return (array[k] + sumNumber(array,k-1));
}

仅基于这两个代码片段,您的程序将无法始终运行。如果 printf 中 k 的值大致高于处理函数所需的堆栈空间乘以您选择的值,那么您将遇到堆栈溢出问题,这可能导致分段错误,因为您正在尝试编写进入一个无效的内存地址。

您想要避免这种情况的方法是通过更改来限制数量:

int k;

scanf("%d", &n);
scanf("%d", &k);

到:

int k=0;

scanf("%d", &n);
while (k==0 || k > 100){
    scanf("%d", &k);
    if (k==0 || k > 100){
        printf("Number invalid\n");
    }
}

这样您将强制用户输入一个从 1 到一定数量的数字,在本例中为 100。

另一种选择是修改 sumNumber 函数,使其不会递归。这样,您可以毫无问题地允许更大的数字。

【讨论】:

  • 谢谢,所以我试了一下,但它又发生了 int n;整数 [MAX];诠释 k = 0; while(n == 0 || n > MAX){ scanf("%d", &n); } while (k==0 || k > n){ scanf("%d", &k); }
  • 您应该将 MAX 设置为至少与 n 相同的值(程序运行时用户输入的第一个数字)
  • 我看到我解决了这个问题,我尝试了你的建议,但它又发生了,所以这次我把整数放在 n 和 k 当我把超过 20000 它发生但是当我把小于 10000 我的程序运行我认为程序的大小比我要大,不过还是谢谢你的帮助
  • 让 20000 工作的方法是增加程序可用的堆栈大小。在 Windows 中,您需要在编译器设置中更改它。在 Linux 中,使用ulimit -s ###,其中### 是用户可以在所有正在运行的程序中分配的总堆栈空间(KB)。
猜你喜欢
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2013-03-05
  • 2014-11-05
  • 2019-11-16
相关资源
最近更新 更多