我试图从文件中读取一行并打印出来。
char *readLine(int n, FILE *file) {
int i;
int BUF=255;
char temp[BUF];
char puffer[BUF];
for(i = 0; i < n-1; i++)
if(fgets(temp, BUF, file) == NULL)
return NULL;
if(fgets(puffer,BUF,file) == NULL)
return NULL;
return puffer;
}
如果我这样做,我不会出错:
char * temp=readLine(2,somefile);
但只要我
printf("%s",temp);
瓦兰返回跟随错误
Conditional jump or move depends on uninitialised value(s)
at 0x402EC04:strcrnul(in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
...
发布于 2013-08-14 22:28:43
您正在返回一个存在于堆栈上的字符数组。当readLine
完成执行时,puffer
的内存将自动消失。
您需要在堆上分配内存。一个快速的解决办法是这样做:
char *readLine(int n, FILE *file) {
int i;
int BUF=255;
char temp[BUF];
char puffer[BUF];
char* returned_string;
for(i = 0; i < n-1; i++)
if(fgets(temp, BUF, file) == NULL)
return NULL;
if(fgets(puffer,BUF,file) == NULL)
return NULL;
returned_string = malloc (strlen (puffer) + 1);
strcpy (returned_string, puffer);
return returned_string;
}
不过,在您的功能中并不需要两个缓冲区。
发布于 2013-08-14 22:30:24
你得把必要的记忆弄清楚。现在,您将返回一个指向函数堆栈上的变量的指针。这可能在函数返回后不再存在,因此您需要一些未定义的行为。
变化
char puffer[BUF];
转到
char* puffer = malloc(BUF);
在你准备好之后,别忘了释放这个记忆。
https://stackoverflow.com/questions/18243190
复制相似问题