在C中的循环中递增整数指针

时间:2018-10-07 08:46:13

标签: c pointers segmentation-fault malloc

我的原始代码以从低到大的顺序显示队列中的节点:

void display (queue *q) {
node *ptr = q->front;
int i = 0;
int size = q->size;
while (i <= size) {
    while (ptr->id != i) {
        ptr = ptr->next;
    }
    if (i == 0) {
        printf("%d ", ptr->id);
        printf("%d\n", ptr->running);
    }
    else {
        printf("%d ", ptr->id);
    }
    i++;
    ptr = q->front;
}

}

一直产生分段错误(核心转储)错误。我已经将malloc的两个变量进行比较,并且此错误已得到解决。

void display (queue *q) {
node *ptr = malloc(10);
ptr = q->front;
int *i = NULL;
i = malloc(sizeof(int));
*i = 0;
int size = q->size;
while(*i <= size){
    while (ptr->id != *i) {
        ptr = ptr->next;
    }
    if (*i == 0) {
        printf("%d %d\n", ptr->id, ptr->running);
    }
    else {
        printf("%d %d %d %d\n", ptr->id, ptr->running, ptr->ready, ptr->blocked);
    }
    i = i + 1 * (sizeof(char));
    ptr = q->front;
}

}

但是现在这不会产生我想要的输出。我想增加i指针,使其可以与原始代码相同。

这令人非常沮丧,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果我正确阅读了您的第一个代码清单,那么您至少需要考虑一件事。您似乎在这里有一个链接列表,并且正在使用ptr = ptr->next遍历该列表。这意味着您需要知道何时停止。设置链接列表的一种常用方法是列表中的最后一项的next值为NULL。然后一次处理一个节点,对一个节点进行处理后,检查next的值是否为NULL:如果不是,则可以在下一个节点上移动,如果是NULL,则停止。

在这里,您没有进行这种检查,因此您需要另一种方式来确保您知道何时停止。您似乎正在做的是获取q->size的值,并使用该值通知您链接列表中有多少个项目。因此,首先要考虑的是您对值是否正确的信心。例如,如果构建列表的代码仅将两个项放入列表,将size设置为三,那么您最终将跌落到列表末尾,并且不会出现分段错误。

但是还有比这更重要的事情。即使您从q->size获取列表中正确的项目数,也要像这样将循环变量isize进行比较:

int i = 0;
while (i <= size) {
  ⋮
}

这将与i的值[0,1,…size]循环,实际上是size + 1倍。如果要精确地循环size次,则需要像i < size这样的测试,而不是i <= size。这是一个常见错误,通常称为off-by-one error

不幸的是,您的第二条清单使事情变得复杂,而不是使事情变得更好。回到第一个,看看是否可以解决我在这里提到的问题。