2012-07-09 38 views
0

我使用fstat來獲取文件大小。我想用這個大小聲明一個數組,然後用另一個fstat改變大小並重新使用相同的數組。例如:c基於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陣列,我必須聲明一個新的。但是,如果我想重新使用不同大小的相同數組,我該怎麼做?
謝謝!

編輯:

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

,但現在我有一個段錯誤:(

+0

任何指示什麼segfaults? (gdb ?,'printf'?) – 2012-07-09 09:59:01

+0

我會嘗試用gdb! :) – polslinux 2012-07-09 10:01:32

+0

我解決了使用雙malloc!所以malloc-free-malloc-free :) – polslinux 2012-07-09 10:11:44

回答

5

不要使用變長數組使用malloc的第一次,然後realloc作爲。

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

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

您現在使用的是一種有趣而有些危險的功能,稱爲「可變長度陣列」。也就是說,你聲明一個在運行時計算長度的數組。這種方法的問題在於它使用堆棧,並且無法通知您是否空間不足。

+0

你是對的人:)爲什麼我以前沒有想過呢? :D thaaanks !! – polslinux 2012-07-09 09:43:04

+0

我更新了問題:( – polslinux 2012-07-09 09:56:08