我有下面的代碼,我不知道為什么我從valgrind得到這個錯誤。 (為了說明情況,我試圖從檔案中復制一個文本到一個字串變數中)
int main(int argc, char **argv)。
{
FILE *fp;
int f_size。
char *string。
fp = fopen("./src/input.txt", "rw ") 。
if (fp == NULL)
{
printf("錯誤!")。
exit(1)。
}
fseek(fp, 0, SEEK_END)。
f_size = ftell(fp);
fseek(fp, 0, SEEK_SET)。
string = (char *)malloc(sizeof(char) * f_size) 。
fread(string, sizeof(char), f_size, fp);
printf("
%s
", string)。)
free(string)。
fclose(fp)。
return 0;
} /* 主 */
我通過printf得到以下錯誤,似乎是這樣的
==19085== Memcheck,一個記憶體錯誤檢測器
==19085== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==19085==使用Valgrind-3.15.0和LibVEX;用-h重新運行以獲得著作權資訊
==19085== 命令。./build/find_word
==19085==
==19085==大小為1的無效讀取
==19085==在0x483EF54處:strlen(在/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)。
==19085==由0x48CEE94。__vfprintf_internal (vfprintf-internal.c:1688)
==19085==由0x48B7EBE: printf (printf.c:33)
==19085==由0x10958C:main (main.c:44)
==19085==地址0x4a4932e在分配了一個大小為142的塊之后是0位元組。
==19085==在0x483B7F3處:malloc(在/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)。
==19085==由0x109555:main(main.c:42)。
==19085==
檔案中的文本
==19085==
==19085==堆總結。
==19085==退出時使用中:0個位元組,0個區塊
==19085== 總的堆使用量。4次分配,4次釋放,5,734位元組分配。
==19085==
==19085== 所有的堆塊都被釋放了 -- 不可能有任何泄漏
==19085==
==19085== 對于檢測到的和抑制的錯誤串列,請用以下方法重新運行。-s
==19085== ERROR SUMMARY: 1個錯誤來自1個背景關系(被抑制:0個來自0個)。
uj5u.com熱心網友回復:
你分配的緩沖區大到足以容納從檔案中讀取的字符,但沒有其他東西。 假設檔案只包含文本,這意味著string實際上不是一個字串,因為沒有結束的空位元組。 所以當你把它傳遞給printf時,它讀到了分配記憶體的末端,這就是valgrind告訴你的。
你需要在分配的記憶體量上加1,并在填滿緩沖區后,在最后一個位元組上手動寫上0,以獲得一個合適的字串。
string = malloc(sizeof(char) * f_size 1);
fread(string, sizeof(char), f_size, fp);
string[f_size] = 0;
uj5u.com熱心網友回復:
你需要一個額外的位元組來存盤空字符。
string = malloc(sizeof(char) * f_size 1)。
讀完后用空字符終止陣列,如下所示。你可以使用fread的回傳值來終止這個字串。
size_t ret = fread(string, sizeof(char), f_size, fp)。)
if (ret != -1) {
string[ret] = 0;
} else {
//Error {
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/322468.html
標籤:
