Почему делает эту работу:
char *fd = "myfile.txt";
struct stat buf;
stat(fd, &buf);
int size = buf.st_size;
printf("%d",size);
Но это не работает:
char *fd = "myfile.txt";
struct stat *buf;
stat(fd, buf);
int size = buf->st_size;
printf("%d",size);
Это простая проблема с распределением памяти.
char *fd = "myfile.txt";
struct stat *buf;
stat(fd, buf);
int size = buf->st_size;
printf("%d",size);
Приведенный выше код только объявляет указатель, но на самом деле не выделяется место в памяти.
вы должны изменить код, чтобы он выглядел следующим образом:
char *fd = "myfile.txt";
struct stat *buf;
buf = malloc(sizeof(struct stat));
stat(fd, buf);
int size = buf->st_size;
printf("%d",size);
free(buf);
Это выделит память и освободит ее после того, как она будет использована.
Во втором случае вы используете указатель, указывающий на «вы не знаете где». stat
случайно сможет правильно заполнить значения в указанной области (здесь ваша программа могла быть внезапно завершена). Затем, поскольку вы не знаете, где находятся эти данные, вы используете их buf-> st_size
, но, возможно, кто-то использовал эту область памяти, которой вы не владеете.
Вы не выделили память для вашего чувака-указателя.
Вы должны выделить память для buf.
buf = malloc(sizeof(struct stat));
теперь будет работать.
Это большая разница между созданием структуры или указателем на структуру. Первый код создает структуру, второй создает указатель на несуществующую структуру. Используя malloc или calloc, вы можете выделить память, и ваша структура будет инициализирована. После этого вы делаете все, что хотите, и в тот момент, когда вам больше не нужна эта структура, вы должны использовать функцию free (), чтобы освободить выделенное пространство.
Причина, по которой это не работает, заключается в том, что buf в первом примере выделяется на стеке. Во втором примере у вас есть только указатель на struct stat, указывающий куда угодно (возможно, на адрес 0x0, т.е. указатель NULL), вам нужно выделить для него память следующим образом:
buf = malloc(sizeof(struct stat));
Тогда оба примера должны работать. При использовании malloc()
, всегда помните об использовании free()
после завершения использования struct stat
:
free(buf);