传递给函数时分配空指针
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'没有影响
该程序包含一个典型的链表节点结构(因此指向下一个节点的指针和一个包含值的整数)。我有以下测试功能:
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'没有影响