此程序包含链表的典型节点结构(因此指向下一个节点的指针和包含值的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()
内的空检查?
答案 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()