簡體   English   中英

valgrind錯誤 - 來自fgets的printf

[英]valgrind error - printf from fgets

我試圖從文件中讀取一行並打印出來。

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

您將返回堆棧中包含的字符數組。 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; 
}

但是,您的函數中並不需要兩個緩沖區。

你必須malloc必要的內存。 現在,您將返回指向函數堆棧上的變量的指針。 在函數返回后,這可能不再存在,因此您可以顯示未定義的行為。

更改

char puffer[BUF];

char* puffer = malloc(BUF);

准備好之后別忘了釋放這段記憶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM