簡體   English   中英

嘗試將結構指針memset()指向0時出現分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM