2013-05-03 73 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。 你也应该习惯于在使用后释放内存。