我有一个结构定义,以及一个接收结构指针并填充相关信息的函数,同时在开头进行空检查。
粗略的例子:
typedef struct
{
int field;
} myStruct;
void myFunc(myStruct *ptr)
{
if(ptr == NULL)
{
printf("Pointer is null!");
}
// rest of code
}
int main()
{
myStruct *ptr = NULL; // tried both *ptr; and *ptr = NULL;
memset(&ptr, 0, sizeof(ptr));
myFunc(ptr);
return 0;
}
这个程序只是我所做的一个例子,结果是失败进行NULL检查。
知道它可能出错吗?也许memset不对?
答案 0 :(得分:0)
ptr
的值为NULL
,因此它没有指向任何内容。您需要将指针指定给有效的内存才能取消引用它。
你应该首先为它分配内存。
myStruct *ptr = malloc(sizeof(*ptr));
myFunc(ptr);
答案 1 :(得分:0)
在大多数平台上,您的程序输出应为Pointer is null!
。
说明:
// setting ptr to NULL
myStruct *ptr = NULL; // declaring and initializing ptr to NULL, this is obvious
以下是更微妙的:
memset(&ptr, 0, sizeof(ptr));
这会将存储sizeof(ptr)
的地址的ptr
字节设置为0,这实际上相当于ptr = 0;
。
现在大多数平台NULL
定义为(void*)0
,因此ptr = NULL
在这些平台上等同于ptr = NULL
。
简短回答:删除memset(&ptr, 0, sizeof(ptr));