分配内存时C中的分段错误

时间:2013-05-03 08:16:01

标签: c memory-management

我是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;

}

3 个答案:

答案 0 :(得分:2)

1)

s=malloc(1024);

不应该在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;

答案 1 :(得分:1)

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

要继续,当您对指针执行sizeof时,您将获得指针的大小。您在readStat

中遇到此问题

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

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

答案 2 :(得分:0)

S = malloc的(1024);不应该在循环中,你应该分配内存一次并使用NULL重置s,然后再使用下一次循环。 你也应养成在使用后释放记忆的习惯。