【发布时间】:2020-06-04 19:50:31
【问题描述】:
我正在试验一个从给定文件中读取新行的 c 函数* 假设事先已经分配了指针。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getLine(char** string, FILE* stream);
int main(){
char* a = (char*) malloc(10);
getLine(&a, stdin);
printf("%s\n", a);
free(a);
return 0;
}
int getLine(char** string, FILE* stream){
char* tmp;
unsigned laenge=0u;
if (strlen(*string)>0)
{
free(*string);
*string = (char *) malloc(sizeof(char));
}
do
{
tmp=(char *)realloc(*string,++laenge);
if(tmp==NULL)
{
printf("Allokation fehlgeschlagen\n");
free(*string);
}
*string=tmp;
(*string)[laenge-1]=fgetc(stream);
if (feof(stream))
{
(*string)[laenge-1]='\0';
return EOF;
}
}
while((*string)[laenge-1]!='\n');
(*string)[laenge-1]='\0';
return laenge;
}
在我的作业中使用它之前,我需要它是正确的,我只有一次机会。
您的意见对我很有价值。
- 在这种情况下会发生内存泄漏吗?
- 使用这样的函数是一种好习惯吗?
- 我错过了什么吗?
如果这可能有帮助,我必须坚持 C89 标准,并且我正在使用 gcc -ansi -pedantic -Wall 编译我的代码
【问题讨论】:
-
代码无法在 C89 模式下编译,因为
if语句在变量声明之前。 -
while((*string)[laenge-1]!='\n');是一个无限循环。真的,使用getline。你的函数有很多错误。你对realloc的处理是错误的——在你free(*string)之后你仍然使用*string = tmp并取消引用它——那么它就是NULL! -
不要从
malloc投射返回。 stackoverflow.com/questions/605845/…