1

我正在尝试从文件中读取一行并打印它。

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);

valgrind 返回以下错误

Conditional jump or move depends on uninitialised value(s)
at 0x402EC04:strcrnul(in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
...
4

2 回答 2

2

您正在返回一个位于堆栈上的字符数组。执行完成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-14T22:28:43.497 回答
1

你必须 malloc 必要的内存。现在您正在返回一个指向函数堆栈上的变量的指针。函数返回后,这可能不再存在,因此您表现出未定义的行为。

改变

char puffer[BUF];

进入

char* puffer = malloc(BUF);

并且在你准备好之后不要忘记释放这个内存。

于 2013-08-14T22:30:24.310 回答