分配内存时C语言中的分段错误
我在C编程方面是个十足的乞丐,我正试图编写一个程序来读取/proc/中“stat”文件的值。它适用于前几个条目,但随后返回“分段错误(核心转储)”。 到目前为止,我发现这个错误与内存分配有关,但我似乎找不到修复它的方法。 到目前为止,我的代码是:分配内存时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);
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。
你也应该养成习惯,在使用完内存后释放内存