Корректное использование Статистики на C

Почему делает эту работу:

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);
16
задан Didier Trosset 29 June 2010 в 07:17
поделиться

5 ответов

Это простая проблема с распределением памяти.

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);

Это выделит память и освободит ее после того, как она будет использована.

10
ответ дан 30 November 2019 в 16:13
поделиться

Во втором случае вы используете указатель, указывающий на «вы не знаете где». stat случайно сможет правильно заполнить значения в указанной области (здесь ваша программа могла быть внезапно завершена). Затем, поскольку вы не знаете, где находятся эти данные, вы используете их buf-> st_size , но, возможно, кто-то использовал эту область памяти, которой вы не владеете.

2
ответ дан 30 November 2019 в 16:13
поделиться

Вы не выделили память для вашего чувака-указателя.

Вы должны выделить память для buf.

buf = malloc(sizeof(struct stat));

теперь будет работать.

1
ответ дан 30 November 2019 в 16:13
поделиться

Это большая разница между созданием структуры или указателем на структуру. Первый код создает структуру, второй создает указатель на несуществующую структуру. Используя malloc или calloc, вы можете выделить память, и ваша структура будет инициализирована. После этого вы делаете все, что хотите, и в тот момент, когда вам больше не нужна эта структура, вы должны использовать функцию free (), чтобы освободить выделенное пространство.

1
ответ дан 30 November 2019 в 16:13
поделиться

Причина, по которой это не работает, заключается в том, что buf в первом примере выделяется на стеке. Во втором примере у вас есть только указатель на struct stat, указывающий куда угодно (возможно, на адрес 0x0, т.е. указатель NULL), вам нужно выделить для него память следующим образом:

buf = malloc(sizeof(struct stat));

Тогда оба примера должны работать. При использовании malloc(), всегда помните об использовании free() после завершения использования struct stat:

free(buf);
28
ответ дан 30 November 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: