【问题标题】:Setting a pointer, remaining NULL设置一个指针,保持 NULL
【发布时间】:2013-11-09 00:23:17
【问题描述】:

我正在尝试实现一个链表,但遇到了一个非常顽固和令人沮丧的问题。这是相关代码。

Node* current = list->head;
Node* previous = malloc(sizeof(Node*));
previous = NULL;
while(current != NULL){
    if(current == NULL){
        printf("current is null");
    }
    last = current;
    current = current->next;
    if(last == NULL){
        printf("last is null");
    }
} 

现在的问题是它正在打印

“最后一个为空”

经常但不打印出来

“当前为空”

一次。如果 current 不为 null 并且我设置 last = current 那么为什么 last 保持为 null?

感谢您提供的所有见解

【问题讨论】:

  • 这段代码在许多琐碎的方面都被严重破坏了。
  • 在一个while循环中,只要current不是NULL,你认为if(current == NULL)什么时候会是真的?
  • 好吧,我认为发生了一些我目前不明白的事情,因为我将 last 设置为 current(不是 NULL)但 last 仍然是 NULL。我将打印语句放入以尝试更好地了解情况:(
  • 令我吃惊的一点是,据称这如何设法打印“last is null”。
  • 老兄,我希望不是这样,但这就是我正在处理的事情

标签: c null-pointer


【解决方案1】:

首先,您不想使用sizeof(Node*),它将分配指针的大小(32 位/64 位/其他取决于平台)。这是没有意义的,因为您可以并且已经使用Node* previous 定义了一个指针。

其次,while() 中的表达式检查 current 是否不等于 NULL。如果 current 等于 NULL,它将简单地退出循环,因此您的 if(current == NULL) 比较将不会执行。

如果您将if(current == NULL) 放在current = current->next; 之后,则可以使该比较有效。但是,如果打印了last is null,那么您的代码也完全存在其他问题,因为current 在last 之前必须为空。令人惊讶的是它没有给出分段错误或其他东西。

【讨论】:

  • 谢谢伙计,不幸的是,这个修复同样的问题仍然存在。当我设置 last = current 时,last 仍然是 NULL 这是我现在最大的问题
  • @BrianDillmann 这似乎是不可能的,因为那样它也不得不说current is null。
  • @BrianDillmann 问题没有足够的数据。完成我所说的更改后,循环不会有任何问题。您可能未能正确定义从 malloc 指针推断的列表。
  • "将分配指针大小(long)" -- 指针大小与long的大小没有必然关系。
  • @KeithThompson 是的,它在 linux 上,但不是必需的。编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2016-03-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多