2013-04-22 127 views
0

我已經在C中實現了一個簡單的隊列系統,但是我遇到了函數append的問題。這不會每次都發生,只是幾次,但我找不到共同點。使用C實現隊列實現中的分段錯誤

gdb說分段錯誤是由行while (*h){引起的,但我認爲是可以的。

這裏的功能是:

int pop (int *h){ 
    int ret = *h, i; 

    for (i = 0; i < 52; i++){ 
     if (!*(h+i)){ 
      *(h+i-1) = 0; 
      break; 
     } 
     else{ 
      *(h+i-1) = *(h+i); 
     } 
    } 
    return ret; 
} 


void append(int *h, int i){ 
    while (*h){ 
     ++h; 
    } 
    *h = i; 
} 

非常感謝你。

注意:隊列大小是固定的,所以進出它的值的數量也是如此,所以問題不在於超出界限。

編輯

我有固定它。下面是功能工作:

int pop (int *h){ 
    int ret = *h, i; 

    for (i = 1; i < 52; i++){ 
     if (!h[i]){ 
      h[i-1] = 0; 
      break; 
     } 
     else{ 
      h[i-1] = h[i]; 
     } 
    } 
    return ret; 
} 


void append(int *h, int i){ 
    int j; 

    for (j = 0; j<52; j++){ 
     if (!h[j]) break; 
    } 
    h[j] = i; 
} 
+0

沒有。 「要不要去越界」 ?當'i'爲0時,引用'*(h + i-1)',這是'h [-1]'.. – 2013-04-22 20:00:08

+0

顯示如何初始化隊列 – 2013-04-22 20:01:17

+2

因此...您永遠不會插入'0'值到你的隊列中? – 2013-04-22 20:02:15

回答

1

對於神起見,使用數組符號[]代替指針引用*()。 在這裏你的代碼有正確的符號,它明顯的問題出在哪裏。

int pop (int *h){ 
    int ret = *h, i; 

    for (i = 0; i < 52; i++){ <--- Change to i=1 
    if (!h[i]){              
     h[i-1] = 0;  <------ Buffer underflow when h[0] == 0 
     break;              
    } 
    else{ 
     h[i-1] = h[i];  <------ Buffer underflow when h[0] != 0 
    } 
    } 
    return ret; 
} 


void append(int *h, int i){ Where's the buffer overflow check ???? 
    while (*h){ 
    ++h; 
    } 
    *h = i; 
} 

你是否還用0值初始化了你的數組?此外,它真的希望你的堆棧/隊列不能包含0值嗎?

編輯:這裏修正版本

int pop (int *h) 
{ 
    int ret = h[0], i = 1; 
    do { 
    h[i-1] = h[i]; 
    } while(h[i] && i<52); 
    return ret; 
} 


void append(int *h, int value) 
{ 
int i; 
    for(i=0; i<52; i++) { 
    if(!h[i]) 
     break; 
    } 
    if(i<52) 
    h[i] = value; 
    else 
    fprintf(stderr, "Array is full\n"); 
} 
+0

我用0值初始化了我的數組,並且隊列不能包含0值。 – user2166141 2013-04-22 20:19:40