【问题标题】:Structs not working as expected in C结构在 C 中未按预期工作
【发布时间】:2017-07-28 21:12:50
【问题描述】:

我有以下程序,下面的输出是用 C 语言编写的。

我希望在为我的尾巴添加一个值之后为 40 和我的头为 30,但事实并非如此。

我是在结构的内存分配方面犯了错误,还是比这不那么明显?

我在 Mac OSX 上使用 GCC 编译器。

#include <stdio.h>

struct LinkedListNode {
    int data;
    struct LinkedListNode *next;
};

struct LinkedList {
    int size;
    struct LinkedListNode *head;
    struct LinkedListNode *tail;
};

struct LinkedList create_linked_list(){
    struct LinkedList linkedList;

    linkedList.size = 0;
    linkedList.head = NULL;
    linkedList.tail = NULL;

    return linkedList;
}

struct LinkedList prepend(struct LinkedList *linkedList, int data){
    struct LinkedListNode linkedListNode;
    linkedListNode.data = data;
    linkedListNode.next = linkedList->head;

    linkedList->head = &linkedListNode;

    if(linkedList->tail == NULL){
        printf("Setting tail to: %d\n", data);
        linkedList->tail = &linkedListNode;
    }else{
        printf("The tail is: %d\n", linkedList->tail->data);
    }

    linkedList->size = linkedList->size + 1;

    return *linkedList;
}

int main(){
    struct LinkedList linkedList;
    linkedList = create_linked_list();

    linkedList = prepend(&linkedList, 40);

    struct LinkedListNode head = *linkedList.head;
    struct LinkedListNode tail = *linkedList.tail;

    printf("%d\n", head.data);
    printf("%d\n", tail.data);
    printf("%d\n", linkedList.size);

    linkedList = prepend(&linkedList, 30);

    head = *linkedList.head;
    tail = *linkedList.tail;

    printf("%d\n", head.data);
    printf("%d\n", tail.data);
    printf("%d\n", linkedList.size);
}

输出:

Setting tail to: 40
40
40
1
The tail is: 30
30
30
2

【问题讨论】:

  • 请不要更新您的问题以包含答案的结果。这就是答案的用途。通过接受答案,您已经展示了如何解决您的问题

标签: c struct linked-list


【解决方案1】:

这里有一个主要问题:

linkedList->head = &linkedListNode;

在这里,您使linkedList-&gt;head 指向本地 变量linkedListNode 的位置。一旦函数返回,该变量将超出范围,并且指针将成为 stray 指针,如果没有 undefined behavior,您将无法再取消引用。

解决这个问题的方法是使用malloc动态分配LinkedListNode结构。

【讨论】:

  • 这样可以吗? linkedListNode = *(struct LinkedListNode *)malloc(sizeof(linkedListNode));
  • @JacobClark, linkedListNode 必须是一个指针。您提供的 sn-p 会将堆分配结构的内容复制到局部变量,这不是您想要的。 linkedListNode = malloc(sizeof(LinkedListNode)) 可能是您想要的。
  • 谢谢!用解决方案更新了我的问题。它是 malloc :)
  • @n0rd 他宁愿养成不将问题转化为答案的习惯,因为当问题很快成为问题的答案时,问题又会在哪里呢?在答案中? ;-)
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多