Я просто хочу установить 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