我只想将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;”这个东西?
答案 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;
但现在你无法取消引用指针。