尝试memset()时结构指针为0时出现分段错误

时间:2015-09-10 21:15:43

标签: c pointers segmentation-fault structure

我只想将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));也抱怨。这个编译很好但我仍然得到seg错误memset((void *) &app, 0, sizeof(app));

如何将此指针设置为struct 0 ?如果我只有一个简单的结构,例如这个struct apple app; (没有指针),它应该像memset(&app, 0, sizeof(app));

因为它是一个指针,而memset的第一个参数是void*,为什么不用只传递一个简单的变量而没有“&amp;”这个东西?

1 个答案:

答案 0 :(得分:1)

您将&app作为参数传递给memset

memset(&app,0,sizeof(app));

这意味着您将该指针的值设置为0。然后,您继续取消引用它。

app->tree = 1;

地址0指向一个你可以写入的地方的可能性极小(实际上,有可能,但没有给出,这个地址代表空指针。)这足以导致分段违规。

你需要用“将0设置为指向结构的指针”来决定你的意思。如果你希望指针对象的内容设置为零,那么你可以使用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;

但现在你无法取消引用指针。