繁体   English   中英

C - 结构中指针的默认值

[英]C - Default value for pointer within a struct

对于C中的单个链表,我有以下非常简单的实现:

typedef struct Node{
        int data;
    struct Node *next;  
} node;


void printLL(node * start);
void addNode(node * head, node * add);

int main()
{
    node first;
    first.data = 99;
    first.next = NULL;

    node second;
    second.data = 11;

    addNode(&first, &second);   
    printLL(&first);    
}

void addNode(node * head, node * add)
{
    if(head->next)
    {
        addNode(head->next, add);
    }
    else 
    {
        head->next = add;
    }
}

void printLL(node * start)
{
    printf("Data is %d\n", start->data);
    if (start->next) {
        printLL(start->next);
    }
}

我很困惑的是,如果我没有显式设置first.next = NULL,我会收到一个EXE_BAD_ACCESS错误。 当我尝试检查是否设置了该属性以确定是否应该递归调用时,会发生这种情况。 另一件我不明白的是,如果我将first.next设置为指向'second',那么即使对于'second',所有函数都可以正常工作。我没有明确地将它设置为NULL。 因此,似乎结构中定义的指针的默认值存在一些不一致。 当然,我可能做了一些完全错误的事情,但如果有人能够阐明这件事,我将不胜感激。 为了解决所有问题,我的问题是:

  1. 结构中定义的指针的默认值是什么?
  2. 假设没有默认值,是否有一种简单的方法可以在结构定义中设置默认值? (我浏览了一些C书,找不到这个问题的答案)

因此,似乎结构中定义的指针的默认值存在一些不一致。

这正是问题 - 编译器没有将自动(本地)变量设置为任何默认值。 因此,您可能会得到一些导致EXE_BAD_ACCESS ,或者您可能会得到一些似乎有效的内容。 这是抽奖的好运(即使看起来有效也是一个错误)。

C的一个缺点是您有责任确保正确初始化变量。 编译器可以协助警告,并非所有编译器在这方面都与其他编译器一样好。

有没有一种简单的方法在结构定义中设置默认值?

在结构的定义中没有办法做到这一点。 但是,您可以在声明该类型的变量时初始化结构:

node first = { 99, NULL };

任何指针都没有默认值,它包含垃圾值。 除非使用您自己的默认值初始化所有指针。

默认值可能取决于C编译器,因此最好提供它们。

在创建结构实例(如second.next = NULL之后,必须先启动它。

结构中的任何内容都没有默认值(除非它是静态创建的)。 并且没有办法提供一个 - 如果你想要那个,你应该使用C ++,它提供构造函数来做到这一点。 如果坚持使用C,则需要显式初始化结构。

调用addNode(&first, &second); ,在if条件下,你正在做head->next是导致问题的原因。 next 默认情况 next未初始化并且在运行时导致EXE_BAD_ACCESS。

但是当你将它设置为NULL时if语句中的条件会失败,并且会进入你实际分配指针的else语句。

如果需要默认指针值,可以创建一个工厂方法,该方法返回结构的新实例,并将值设置为所需的默认值。

没有默认值。 除非明确修改,否则每个内存位置将保持其具有的任何值。 虽然此行为本身依赖于编译器。 底线,你不能假设它将包含一个特定的值。

要设置默认值,最好在创建struct属性时为struct属性显式赋值。

如果您使用的是C++ ,那么您将拥有构造函数,您可以/应该设置成员的默认值。

无论是否为struct ,自动变量都不会在C中初始化。 你必须自己初始化它们。

但与此处的大多数答案似乎暗示存在任何数据类型(包括指针)的初始化默认值相反。 这样做就像任何组件将由普通值'0'显式初始化一样。 以你为榜样

node first = { .data = 99 };

本来可以做到的。 然后保证next正确初始化。 (如果你没有C99省略.data =并希望你永远不会改变struct的布局:)

还要注意,这可能不同于使用memsetstruct memset 在某些体系结构中,全0位模式可能不是空指针或double精度的正确初始化。 因此,最好坚持语言本身提供的初始化机制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM