簡體   English   中英

為什么會出現此細分錯誤錯誤?

[英]Why am i getting this segmentation fault error?

我正在嘗試使用此代碼以特定方式對數組進行坐標處理,但是我總是在第25行遇到分段錯誤,但是我不明白為什么。

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

void bq(int* v, int s, int e);

int main(void){
  int* v;
  for(int i = 10; i <= 30; i = i + 10){
    v = (int*) malloc (i*sizeof(int));
    for(int j = 0; j < i; j++)
        v[j] = j;
    bq(v, 0, i-1);
    for (int k = 0; k < i; k++){
        printf("%d ", v[k]);
    }
    free(v);
    printf("\n");
  }
  return 0;
}

void bq(int* v, int s, int e){
  if (e+s+1 > 2){
    int m = (e+s+1) / 2;
    bq(v, m+1, e);
    bq(v, s, m-1);
    int aux = v[e];
    v[e] = v[m];
    v[m] = aux;
  } 
}

bq函數頂部添加一個printf語句:

void bq(int* v, int s, int e) {
    printf("e=%d, s=%d,  e+s+1=%d\n", e, s, e + s + 1);
    if (e + s + 1 > 2) {

運行程序時,您將看到輸出。

e=9, s=0,  e+s+1=10
e=9, s=6,  e+s+1=16
e=9, s=9,  e+s+1=19
e=9, s=10,  e+s+1=20
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
...

換句話說, bq函數收斂到只是使用相同的參數bq(v, 9, 11)遞歸調用自身。 但是由於9+11+1始終大於2 ,所以它處於無限遞歸循環中。 否則稱為堆棧溢出。 最終結果是堆棧內存不足,程序崩潰。

我的心理力量建議這一行:

if (e+s+1 > 2){

旨在表達“如果我在v [s..e]范圍內至少有兩個元素”。 在這種情況下,它應顯示為:

if (e-s+1 > 2){

不確定程序的其余部分是否正確,但這只是一個開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM