0

我已经在 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;
}
4

1 回答 1

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");
}
于 2013-04-22T20:06:46.897 回答