我正在处理一个项目,我一直遇到这个错误,不允许我完成项目。当我初始化我的一个指针指向将在程序执行期间生成的对象时,我将其初始化为NULL
。然后,当我检查它的设置时,返回值nil
。这样的事情怎么可能?我不相信C中存在零指针。有什么方法可以解决这个问题吗?
struct order_line *front = NULL;
...
printf("Head: %p\n", front); // prints -> Head: (nil)
答案 0 :(得分:10)
%p
中的 printf
格式化指针类型。这将区分空指针和打印(nil)
,因为它是指针上下文中的特殊值。如果要为空指针输出0,请将指针强制转换为整数并改为使用%d
:
printf("Head: %d\n", (int) front);
原始答案,因为它可能仍然有用:
NULL
是定义为0
或((void *) 0)
的宏,因此,如果您设置指向NULL
的指针,则与将其设置为0
的指针完全相同。这适用于声明空指针的目的,因为地址0的内存永远不会分配给您的程序。
答案 1 :(得分:3)
当您使用printf("%p", somePtr)
打印指针时,它会以实现定义的方式打印,根据POSIX printf specification的引用(C99中存在类似的措辞)规范也)。
参数必须是指向void的指针。指针的值将以与实现相关的方式转换为可打印字符序列。
我想,这意味着如果指针是NULL
,它可能会打印出它想要的内容,包括将其打印为nil
或0x00000000
或0
。< / p>
答案 2 :(得分:1)
使用
printf("Head: %s, %d, %p\n", front, front, front);
打印Head: (null), 0, (nil)
由于 Packia
答案 3 :(得分:0)
我假设你的调试器告诉你的是nil。在大多数编译器中,null只是#define ed为0,因此名称并不重要。
答案 4 :(得分:0)
正如其他人所说,C中没有nil指针这样的东西。
可能是您的内存分配失败,导致0
被分配给指针。
答案 5 :(得分:0)
如果您的问题是将指针值与NULL进行比较,则printf()打印的值无关紧要。您仍然可以 if(ptr == NULL)
答案 6 :(得分: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-&gt; p ---删除后 - 无 变量的地址是--- ps-&gt; p ---删除后 - 0
对于if条件,它将评估为false。