【问题标题】:Increment integer pointer in a loop in C在C中的循环中增加整数指针
【发布时间】:2018-10-07 08:46:12
【问题描述】:

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

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 指针,以便它可以与我的原始代码相同。

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

【问题讨论】:

  • 你这里有内存泄漏node *ptr = malloc(10);ptr = q-&gt;front;
  • 为什么要动态分配单个int?为什么要乘以 sizeof(char),根据定义,它是 1?
  • @melpomene:这是我找到的修复分段错误的方法,我乘以 sizeof(char) 作为指针加 1 的尝试
  • 您的第二种方法不能解决分段错误,这只是您没有遇到这种情况的事实。
  • @Jason 提供了minimal reproducible example 和更多背景信息,我们可以为您提供帮助。

标签: c pointers segmentation-fault malloc


【解决方案1】:

如果我正确阅读了您的第一个代码清单,那么您至少需要考虑一件重要的事情。您似乎在这里有一个链接列表,并且您正在使用ptr = ptr-&gt;next 遍历该列表。这意味着您需要知道何时停止。建立链接列表的一种常见方法是列表中的最后一项具有nextNULL。然后一次处理一个节点,完成一个节点后,检查next 值是否为NULL:如果不是,则可以继续下一个节点,如果是@ 987654327@你停下来。

在这里您不会进行这样的检查,因此您需要另一种方法来确保您知道何时停止。您似乎正在做的是获取 q-&gt;size 的值并使用它来通知您链接列表中有多少项目。所以首先要考虑的是你对这个值是正确的有多大信心。例如,如果构建列表的代码只将两个项目放入列表中,bet 将size 设置为三个,那么您最终会掉出列表的末尾,并且不太可能出现分段错误。

但还有比这更重要的事情。即使您从q-&gt;size 获得列表中正确数量的项目,您也可以像这样比较循环变量isize

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

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

不幸的是,您的第二个列表使事情变得复杂,而不是让事情变得更好。回到你的第一个,看看你能不能解决我在这里提到的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2015-08-25
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多