10

我正在做一个项目,但我不断遇到这个错误,我无法完成这个项目。当我初始化我的一个指针以指向将在程序执行期间创建的对象并将其初始化为NULL. 然后,当我检查它的设置时,它返回一个nil. 这样的事情怎么可能?我不相信 C 中存在 nil 指针。有没有办法解决这个问题?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
4

7 回答 7

15

%pprintf格式为指针类型。这将区分空指针和打印(nil),因为它是指针上下文中的特殊值。如果要为空指针输出 0,请将指针转换为整数并%d改用:

printf("Head: %d\n", (int) front);

原始答案,因为它可能仍然有用:

NULL是一个定义为0or的宏((void *) 0),因此如果您将指针设置为NULL它与将其设置为0. 这适用于声明空指针,因为地址 0 处的内存永远不会分配给您的程序。

于 2011-01-20T07:55:07.163 回答
3

当您使用 打印指针时printf("%p", somePtr),它以实现定义的方式打印,根据POSIX printf 规范中的此引用(C99 规范中也存在类似的措辞)。

参数必须是指向 void 的指针。指针的值以与实现相关的方式转换为可打印字符序列。

我想,这意味着如果指针是NULL,它可以随心所欲地打印它,包括将其打印为nilor0x000000000

于 2011-01-20T08:04:24.760 回答
3

采用

printf("Head: %s, %d, %p\n", front, front, front);

打印Head: (null), 0, (nil)

谢谢帕奇亚

于 2011-01-20T11:58:07.183 回答
1

我假设 nil 是你的调试器告诉你的。在大多数编译器中, null 无论如何都只是 #define ed 为 0 ,因此该名称并不那么重要。

于 2011-01-20T07:56:02.467 回答
0

正如其他人所说,C 中没有 nil 指针这样的东西。

可能是你的内存分配失败,导致0被分配给指针。

于 2011-01-20T07:59:58.910 回答
0

如果您的问题是将指针值与 NULL 进行比较,则 printf() 打印的值无关紧要。你仍然可以这样做if(ptr==NULL)

    ptr = (nil) 和 NULL = (nil) => ptr = NULL :)

您得到的错误一定是由于其他原因。

于 2011-01-20T09:28:23.377 回答
0

在用 int 转换结构指针后,它用 if 语句提供了预期的条件。

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p);
printf("The address of the variable is---ps->p---After Deletion--  %d \n",(int)ps->p);
if((int)ps->p){
printf("Again in Free\n");
doFree((void **)&ps->p);
}

输出 :-

变量的地址是---ps->p---删除后-- nil 变量的地址是---ps->p---删除后-- 0

对于 if 条件,它将评估为 false 。

于 2013-10-06T04:35:19.907 回答