[英]Segmentation fault when trying to memset() a structure pointer to 0
我只想將0設置為指向這樣的結構的指針:
#include <stdio.h>
#include <string.h>
struct apple
{
int f;
int d;
size_t tree;
};
struct apple *app;
int main(void)
{
memset(&app,0,sizeof(app));
app->tree = 1;
app->d = 4;
app->f = 2;
printf("%d %d %lu\n",app->d, app->f, app->tree);
}
使用gcc -o foo foo.c
正常編譯,但是運行時出現Segmentaion錯誤。 我嘗試了memset(app, 0 , sizeof(app));
但它抱怨,我嘗試了memset(*app, 0,sizeof(app));
也抱怨。 這個編譯很好,但我仍然遇到段錯誤memset((void *) &app, 0, sizeof(app));
我應該怎么做才能將此指針設置為結構0 ? 如果我只是一個簡單的結構是這樣的: struct apple app;
(沒有指針),它應該類似於memset(&app, 0, sizeof(app));
因為它是一個指針,並且memset的第一個參數為void*
,所以為什么不像只傳遞一個簡單的變量而沒有“&”一樣工作呢?
這個:
memset(&app,0,sizeof(app));
用零覆蓋app
(指針)。 我們開局不好。
然后,我們嘗試引用app
(現在為NULL
):
app->tree = 1;
而且情況變得更糟了。
您要分配一些東西給app
指向:
app = malloc(sizeof(struct apple));
memset(app, 0, sizeof(struct apple));
要么
app = calloc(1, sizeof(struct apple)); // calloc zeroes things out for you
您在此處將&app
作為參數傳遞給memset
:
memset(&app,0,sizeof(app));
這意味着您正在將該指針的值設置為0
。 然后,您可以取消引用它。
app->tree = 1;
地址0
極不可能指向您可以寫入的位置(實際上,有可能但沒有給出該地址表示空指針的信息。)這足以引起分段沖突。
您需要確定“將0設置為指向結構的指針”的含義。 如果要將pointee的內容設置為零,則可以在指向某個分配的內存后使用memset
:
app = malloc(sizeof(*app)); // allocate space for an apple object
memset(app, 0, sizeof(*app)); // app, not &app!!!
注意,您可以使用calloc
分配和零初始化分配的內存。
app = calloc(1, sizeof(*app));
如果您確實希望將指針的值設置為0,則可能是將其設置為空指針,可以這樣實現:
app = NULL;
但是現在您不能取消引用指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.