传递给函数时分配空指针

时间:2015-10-10 07:45:23

标签: c pointers pass-by-reference

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

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

我不明白为什么将空指针传递给函数将始终导致第一种情况发生。似乎指针正在通过值传递,但我不认为这是正在发生的事情。如果我在malloc()内的节点上调用main()然后将其传递给F(),则会触发第二种情况,但不会触及第一种情况。这至少对我有意义,因为当节点从F()传递给main()时,节点永远不会为空,但显然在将节点传递给F()之前分配节点意味着F()内的空检查永远不会成立。

我正在尝试做甚么可能吗?有没有办法将n传递给F(),而它是空的并且它的行为方式与我想要的一样?或者我是否必须在n之外分配F()并删除F()内的空检查?

2 个答案:

答案 0 :(得分:2)

分配X后,您需要在*Y函数F()中设置它。否则,F()返回后不会反映出来。

所以我会将代码更改为

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;
}

答案 1 :(得分:0)

在功能F()中,当' n'在main()中包含NULL;

代码未设置' n'的内容指向malloc的记忆。

更改本地变量' X'中包含的值没有影响' n'在main()