web-dev-qa-db-ja.com

CでのStatの正しい使用

なぜこれが機能するのですか?

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

これが機能しない理由は、最初の例のbufがスタックに割り当てられているためです。 2番目の例では、struct statへのポインターのみがあり、どこかを指している(おそらくアドレス0x0を指している、つまりNULLポインター)。このため、次のようにメモリーを割り当てる必要があります。

_buf = malloc(sizeof(struct stat));
_

その後、両方の例が機能するはずです。 malloc()を使用する場合は、_struct stat_の使用が終了した後、必ずfree()を使用することを忘れないでください。

_free(buf);
_
27
Puppe

これは単なるメモリ割り当ての問題です。

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

2番目では、you-dont-know-whereを指すポインターを使用します。 statは、指定された領域の値を正しく満たすことができます(プログラムがここで突然終了した可能性があります)。次に、このデータの場所がわからないので、それを使用しますbuf->st_sizeしかし、誰かがあなたが所有していないこのメモリ領域を使用した可能性があります。

2
Didier Trosset

これは、構造体の作成と構造体へのポインターの大きな違いです。最初のコードは構造を作成し、2番目のコードは既存の構造へのポインターを作成します。 mallocまたはcallocを使用すると、メモリを割り当てることができ、構造が初期化されます。この後、必要なことをすべて行い、現時点でこの構造が不要になった時点で、割り当てられたスペースを解放するためにfree()関数を使用する必要があります。

1
Lajos Arpad

ポインタにメモリを割り当てていません。

メモリをbufに割り当てる必要があります。

buf = malloc(sizeof(struct stat));

今それは動作します。

1
Kumar Alok

これで問題が解決するはずです。ファイルサイズは32ビットまたは64ビットの整数にすることができます。この例では、64ビットマシンを想定しています。

#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