web-dev-qa-db-fra.com

Utilisation correcte de Stat sur C

Pourquoi ça marche:

char *fd = "myfile.txt";
struct stat buf;          

stat(fd, &buf);
int size = buf.st_size;

printf("%d",size);

Mais ça ne marche pas:

char *fd = "myfile.txt";
struct stat *buf;          

stat(fd, buf);
int size = buf->st_size;

printf("%d",size);
11
necronet

La raison pour laquelle cela ne fonctionne pas est que buf dans le premier exemple est alloué sur la pile. Dans le deuxième exemple, vous n'avez qu'un pointeur sur une struct stat, pointant vers n'importe où (probablement vers l'adresse 0x0, c'est-à-dire NULL), vous devez lui allouer de la mémoire comme ceci:

buf = malloc(sizeof(struct stat));

Ensuite, les deux exemples devraient fonctionner. Lorsque vous utilisez malloc(), pensez toujours à utiliser free() lorsque vous avez terminé d'utiliser le struct stat:

free(buf);
23
Puppe

C'est juste un simple problème d'allocation de mémoire.

char *fd = "myfile.txt";
struct stat *buf;          

stat(fd, buf);
int size = buf->st_size;

printf("%d",size);

Le code ci-dessus ne déclare qu'un pointeur, mais en réalité, aucun espace mémoire n'est alloué.

vous devriez modifier le code pour ressembler à ceci:

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

Cela allouera la mémoire et la libérera après son utilisation.

10

Dans le second cas, vous utilisez un pointeur pointant vers vous-ne-savez-pas-où. stat pourra par hasard renseigner correctement les valeurs dans la zone indiquée (votre programme aurait pu s'achever brusquement ici). Ensuite, comme vous ne savez pas où se trouvent ces données, vous l’utilisez buf->st_size mais peut-être que quelqu'un a utilisé cette zone mémoire que vous ne possédez pas.

2
Didier Trosset

C'est une grande différence entre créer une structure ou un pointeur sur une structure. Le premier code crée la structure, le second crée un pointeur sur une structure non existante. En utilisant malloc ou calloc, vous pouvez allouer de la mémoire et votre structure sera initialisée. Ensuite, vous faites ce que vous voulez et au moment où vous n’avez plus besoin de cette structure, vous devez utiliser la fonction free () pour libérer l’espace alloué.

1
Lajos Arpad

Vous n'avez alloué aucune mémoire pour votre mec pointeur.

Vous devriez allouer de la mémoire à buf.

buf = malloc(sizeof(struct stat));

maintenant ça va marcher.

1
Kumar Alok

Cela devrait résoudre votre problème et un autre: la taille du fichier peut être un int ou 32 bits. Cet exemple suppose une machine 64 bits.

#include <stat.h>
#include <errno.h>

char *file = "myfile.txt";
long long size; //st_size can be a 64-bit int.
struct stat *buf = malloc(sizeof(struct stat)); //allocates memory for stat structure.
errno = 0; //always set errno to zero first.

if(stat(file, buf) == 0)
{
    size = buf->st_size;
    printf("Size of \"%s\" is %lld bytes.\n", file, size);
}
else
{
    perror(file);    //if stat fails, print a diagnostic.
}
0
CyberSkull