Я просто хочу установить 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));
тоже жалуется. Этот компилируется нормально, но я все еще получаю ошибку segmemset((void *) &app, 0, sizeof(app));
Что я должен сделать, чтобы установить этот указатель на структуру 0? Если у меня есть простая структура, подобная этой: struct apple app;
(без указателя), она должна выглядеть как memset(&app, 0, sizeof(app));
Поскольку это указатель, а memset имеет первый параметр a void*
, почему не работает передача простой переменной без "&"?
memset(app, 0 , sizeof(*app));
, и это работает как шарм, но без malloc это не работает. Почему? Также, пожалуйста, объясните мне, почему я должен использоватьsizeof(*app);
вместоsizeof(app)
? 11.09.2015sizeof(app)
будет просто размером самого указателя. Это может быть больше или меньше размера файлаstruct
. Либо вы перезапишете память, которой не владеете (больше), либо не заполните всю структуру (меньше). 11.09.2015app = NULL;
(во всех реальных системах, где указатель всех нулевых байтов совпадает сNULL
). Очевидно неправильно, но это не превышение; память до и после остается неизменной, толькоNULL
разыменование делает плохие вещи. 11.09.2015sizeof(*app)
для размера выделения, иначе он выделяет достаточно только для указателя, а не для структуры. Когда он работает без этого, это совпадение выделения malloc/calloc с большей шириной, чем запрошено (это может сработать или повредить вашу кучу, повеселитесь, угадав, что именно). :-) 11.09.2015valgrind ./foo
, он говорит:heap usage: 1 allocs, 1 frees, 16 bytes allocated
почему 16 ? я думаю, что размер моей структуры равен 8, потому что sizeof (size_t) = 8 байт. 11.09.2015memset()
в этом примере является избыточным — указатель уже инициализирован0
, поскольку он размещен статически. 11.09.2015