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;

}
4

3 回答 3

2

1) 的

s=malloc(1024);

不应该进入while它应该在while循环和while之前。

并在离开函数之前释放它:

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;
于 2013-05-03T08:24:44.543 回答
1

首先,您不为string变量的终止符分配空间。您还需要先终止它,然后才能将其用作strcat.

要继续,当您sizeof对指针执行操作时,您会得到指针的大小,而不是指针指向的内容。你有这个问题。readStat

您也有内存泄漏,因为您调用readFile了两次,但从未释放其中分配的内存。哦,其中一个内存分配readFile根本不需要。

还有另一个内存泄漏,您为 分配内存pch,但是在分配调用结果时丢失了该指针strtokstrtok在调用中返回一个指向字符串的指针strtok,因此无需为它分配内存(无论如何您都没有尝试释放)。

于 2013-05-03T08:18:45.950 回答
0

s=malloc(1024); 不应该在循环中,您应该分配一次内存并在下次循环使用之前将 s 重置为 NULL。此外,您应该养成使用后释放内存的习惯。

于 2013-05-03T08:29:12.787 回答