传递给函数时分配空指针

allocating null pointer when passed to function

该程序包含一个典型的链表节点结构(因此指向下一个节点的指针和一个包含值的整数)。我有以下测试功能:

void F(NODE** Y, int value)
{
    NODE* X = *Y;

    if(!X)
    {
        printf("case1...\n");
        X = (NODE*)malloc(sizeof(NODE));
        X->Data = value;
        return;
    }
    printf("case2...\n");
    X->Next = (NODE*)malloc(sizeof(NODE));
    X->Next->Data = value;
    return;
}

void myPrint(NODE** Y)
{
    NODE* X = *Y;
    printf("printing...\n");

    printf("%d %d\n", X->Data, X->Next->Data);
    return;
}

int main()
{
    NODE* n = NULL;

    F(&n, 5);
    F(&n, 10);

    myPrint(&n);
}

此代码在 Linux 中产生以下输出:

case1...
case1...
printing...
Segmentation fault

我不明白为什么将空指针传递给函数总是会导致第一种情况发生。指针似乎是按值传递的,但我认为这不是正在发生的事情。如果我在 main() 内部的节点上调用 malloc(),然后将其传递给 F(),第二种情况将被命中,但不会命中第一种情况。这至少对我来说有部分意义,因为节点从 main() 传递到 F() 时永远不会为空,但显然在将节点传递到 F() 之前分配节点意味着F() 内的空检查永远不会为真。

我想做的事情有可能吗?有没有办法在 n 为 null 时将其传递给 F() 并让它按照我想要的方式运行?或者我是否必须在 F() 之外分配 n 并删除 F() 内部的空检查?

X 分配后,您需要在函数 F() 中的 *Y 中进行设置。否则,一次 F() returns 不会反映出来。

所以我会将代码更改为

void F(NODE** Y, int value)
{
    NODE* X = *Y;

    if(!X)
    {
        printf("case1...\n");
        X = (NODE*)malloc(sizeof(NODE));
        X->Data = value;

        *Y = X;  //set the allocated pointer
        return;
    }
    printf("case2...\n");
    X->Next = (NODE*)malloc(sizeof(NODE));
    X->Next->Data = value;
    return;
}

在函数F()中当main()中的'n'包含NULL时;

代码未将 'n' 的内容设置为指向 malloc 的内存。

改变局部变量'X'中包含的值对main()

中的'n'没有影响