2013-05-03 97 views
0

我在C語言中總初學者,我試圖寫一個程序,讀取在/ proc /「STAT」文件的價值。它適用於前幾個條目,但它會返回「分段錯誤(核心轉儲)」。 到目前爲止,我發現了錯誤與內存分配的事,但我似乎無法找到一個方法來解決它。 到目前爲止我的代碼是:分割錯誤,而分配內存

char* readFile(char* filename) 
{ 
FILE *fp; 
    struct stat buf; 
    fp=fopen(filename,"r"); 
    stat(filename,&buf); 
    char *string = malloc(buf.st_size); 
    char *s; 
    while(!feof(fp)) 
    { 
      s=malloc(1024); 
      fgets(s,1024,fp); 
      s[strlen(s)-1]='\0'; 
      strcat(string,s); 
    } 
    return string; 

} 

char* readStat(char* path, int statNumber) 
{ 

    char* str = malloc(sizeof(readFile(path))); 
    str = readFile(path); 
    char * pch = malloc(sizeof(str)); 
    char * vals; 
    pch = strtok (str," "); 
    int i = 1; 
    while (pch != NULL) 
    { 
    if(i == statNumber) 
     vals = pch; 
    pch = strtok(NULL, " "); 
    i++; 
    } 
    return vals; 

} 

回答

2

1)

s=malloc(1024); 

不應入而它應該是oitside while循環和同時之前。

並釋放IT離開函數之前:

free(s); 

2)添加

string[0] = '\0'; 

剛過

char *string = malloc(buf.st_size); 

否則strcat將無法​​正常工作

3)你並不需要爲str指針分配內存,因爲readFile功能已經做了

char* str = malloc(sizeof(readFile(path))); 

只是

char* str; 

4)和更換也

更換

char * pch = malloc(sizeof(str)); 

char * pch = str; 
+0

謝謝,這個伎倆! – user1946334 2013-05-03 12:45:14

1

首先,你沒有爲終止爲string變量分配空間。您還需要終止它,然後才能將其用作strcat的目標。

要繼續,當你在一個指針做sizeof,你得到的指針的大小和它所指向。您在readStat中遇到此問題。

你也有內存泄漏,在您致電readFile兩次,但從來沒有在釋放它分配的內存。哦,readFile中的一個內存分配根本就不需要。

還有另一個內存泄漏,因爲您爲pch分配了內存,但是當您指定strtok調用的結果時,會丟失該指針。 strtok返回一個指針,指向strtok呼叫字符串,所以沒必要爲它分配內存(你沒有嘗試反正免費的)。

0

S = malloc的(1024);不應在循環中,您應該分配一次內存,並在下次使用循環之前將其重置爲NULL。 你也應該習慣於在使用後釋放內存。