在struct中打印Int打印地址

时间:2015-03-09 22:26:24

标签: c

我正在读一本算法书,我发现自己被困在这一点上。我创建了一个双向链表,当我尝试打印出它的内容时,它打印出我认为的地址或其他与我想要的无关的值。这是代码:

typedef struct double_element *dElement;
struct double_element
{
    int value;
    dElement prev;
    dElement next;
};

dElement createNewDListWithElements(int count)
{
    dElement element = malloc(sizeof(dElement));

    element->value = 1;
    element->next = NULL;
    element->prev = NULL;

    dElement previous = element;

    for (int i = 1; i < count; i++) {

        dElement el = malloc(sizeof(dElement));

        el->value = i;
        el->next = NULL;
        el->prev = previous;
        previous->next = el;

        previous = el;
    }

    return element;
}

void printDList(dElement node)
{
    printf("printing doubly linked list:\n");

    while (node) {

        printf("%i\n", node->value);

        node = node->next;
    }

    printf("end printing double linked list\n");
}

这是输出:

printing doubly linked list:
1
1070320
1070336
1070352
1070368
1070384
1070400
1070416
1070432
1070448
end printing double linked list

2 个答案:

答案 0 :(得分:6)

您的问题是您正在尝试为struct double_element分配空间,但您只需要足够的空间来存储struct double_element*

答案 1 :(得分:2)

问题是你是为指针而不是结构本身分配空间,这是指针危险typedef的原因,如果你想保证分配是正确的,无论typedef如何您可以在代码中执行此操作

dElement element = malloc(sizeof(*element));

将为结构分配空间,就像你调用了

一样
dElement element = malloc(sizeof(struct double_element));

你可以看到typedef是有害的,指针应该是一个明确的指针,所以编写代码的正确方法不会出现这种问题

struct double_element *element = malloc(sizeof(struct double_element));
/*                    ^ don't skip this no matter what */

另外,你应该清楚结构名称是什么以及如何命名你的变量,例如你可以使用 CamelCase 作为结构名称,使用带有下划线的小写作为变量,类似于此

struct DoubleElement *element = ...

它会清楚地表明DoubleElement是结构的名称,即使你可以离开struct而不是tyepdef,因为这样可以使它更清晰。