C中队列实现中的分段错误

时间:2013-04-22 19:57:47

标签: c segmentation-fault queue implementation

我在C中实现了一个简单的队列系统。但是我遇到了函数append的问题。这种情况不会每次发生,只发生几次,但我找不到共同点。

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;
}

1 个答案:

答案 0 :(得分: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");
}