0

fstat を使用してファイル サイズを取得します。このサイズを使用して配列を宣言し、別の fstat でサイズを変更して、同じ配列を再利用したいと考えています。例:

fstat(file1, &fileStat);
fsize = filestat.st_size;
char filebuffer[size-of-file1];
/* do something */
fstat(file2, &fileStat);
fsize = filestat.st_size;
char filebuffer[size-of-file2];
/* do something */

明らかに、ファイルバッファ配列を再宣言することはできません。新しいものを宣言する必要があります。しかし、同じ配列を異なるサイズで再利用したい場合はどうすればよいですか??
ありがとう!!

編集:

filebuffer = malloc(fsize);
if(filebuffer == NULL){
    perror("malloc");
    onexit(sockd, 0, fd, 4);
}

tmpfilebuf = realloc(filebuffer, fsize);
if(tmpfilebuf){
    filebuffer = tmpfilebuf;
}
else{
    perror("realloc");
    free(filebuffer);
    onexit(sockd, 0, fd, 4);
}

しかし今、私はセグメンテーション違反を起こしました:(

4

1 に答える 1

5

可変長配列は使用しないでください。malloc最初に使用し、その後reallocは必要に応じて使用してください。

char *filebuffer;    
filebuffer = malloc(...);

tmp = realloc(filebuffer, ...);
if (tmp)
    filebuffer = tmp;

あなたが今使っているのは「可変長配列」という、面白くてちょっと危険な機能です。つまり、実行時に計算された長さで配列を宣言します。このアプローチの問題点は、スタックを使用し、十分なスペースがない場合に通知する手段がないことです。

于 2012-07-09T09:41:21.987 に答える