Memset结构指针导致null检查失败

时间:2017-07-17 00:27:30

标签: c struct

我有一个结构定义,以及一个接收结构指针并填充相关信息的函数,同时在开头进行空检查。

粗略的例子:

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不对?

2 个答案:

答案 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

示范:http://ideone.com/SwxaKv

简短回答:删除memset(&ptr, 0, sizeof(ptr));