我在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;
}
答案 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");
}