[英]Memset struct pointer causing null check failure
我定義了一個結構,並有一個函數接收結構指針並填寫相關信息,同時在開始時進行空檢查。
粗略的例子:
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不對嗎?
ptr
的值為NULL
,所以它沒有指向任何東西。 您需要將指針分配給有效內存才能取消引用。
您應該首先為其分配內存。
myStruct *ptr = malloc(sizeof(*ptr));
myFunc(ptr);
程序的輸出應為Pointer is null!
在大多數平台上。
說明:
// setting ptr to NULL
myStruct *ptr = NULL; // declaring and initializing ptr to NULL, this is obvious
以下是更微妙的:
memset(&ptr, 0, sizeof(ptr));
這ptr
存儲ptr
的地址處的sizeof(ptr)
字節設置為0,這實際上等效於ptr = 0;
。
現在,在大多數平台上, NULL
被定義為(void*)0
,因此在這些平台上ptr = NULL
等效於ptr = NULL
。
示范: http : //ideone.com/SwxaKv
簡短答案:刪除memset(&ptr, 0, sizeof(ptr));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.