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

分配内存时C语言中的分段错误,c,memory-management,C,Memory Management,我在C编程方面是个十足的乞丐,我正试图编写一个程序来读取/proc/中“stat”文件的值。它适用于前几个条目,但随后返回“分段错误(核心转储)”。 到目前为止,我发现这个错误与内存分配有关,但我似乎找不到修复它的方法。 到目前为止,我的代码是: char* readFile(char* filename) { FILE *fp; struct stat buf; fp=fopen(filename,"r"); stat(filename,&buf);

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

}

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

要继续,当您对指针执行
sizeof
操作时,您会得到指针的大小,而不是它指向的内容。您在
readStat
中遇到此问题

您还存在内存泄漏,即调用
readFile
两次,但从未释放其中分配的内存。哦,
readFile
中的一个内存分配根本不需要


还有另一个内存泄漏,您为
pch
分配内存,但在分配
strtok
调用的结果时,指针松动了
strtok
返回一个指向
strtok
调用中字符串的指针,因此无需为其分配内存(您没有尝试释放内存)。

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

要继续,当您对指针执行
sizeof
操作时,您会得到指针的大小,而不是它指向的内容。您在
readStat
中遇到此问题

您还存在内存泄漏,即调用
readFile
两次,但从未释放其中分配的内存。哦,
readFile
中的一个内存分配根本不需要

还有另一个内存泄漏,您为
pch
分配内存,但在分配
strtok
调用的结果时,指针松动了
strtok
返回一个指向
strtok
调用中字符串的指针,因此无需为其分配内存(您没有尝试释放内存)。

1

不应进入while,而应在while循环旁边和while之前

并在离开功能之前释放它:

free(s);
2) 加

刚过

char *string = malloc(buf.st_size);
否则,strcat将无法正常工作

3) 您不需要为
str
指针分配内存,因为
readFile
函数已经分配了内存

char* str = malloc(sizeof(readFile(path)));
刚刚被替换为

char* str;
4) 并且还替换

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

1)

不应进入while,而应在while循环旁边和while之前

并在离开功能之前释放它:

free(s);
2) 加

刚过

char *string = malloc(buf.st_size);
否则,strcat将无法正常工作

3) 您不需要为
str
指针分配内存,因为
readFile
函数已经分配了内存

char* str = malloc(sizeof(readFile(path)));
刚刚被替换为

char* str;
4) 并且还替换

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

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

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