所以我一直在教自己C,爲了學習如何從一開始就正確地管理內存並編寫更好的代碼,我一直在運行Valgrind。這幫助我解決了內存泄漏問題,但似乎無法擺脫這種「有條件的跳轉或移動取決於未初始化的值/未初始化的值由堆分配創建」的情況,儘管我已經縮小了它的範圍到的代碼塊:Valgrind對未初始化值的抱怨是否爲假陽性?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* test = (char*) malloc(3);
strncpy(test, "123", 2);
printf("%s\n", test);
free(test);
return 0;
}
當我與---track-origins=yes
運行Valgrind的,我得到這樣的輸出:
==91702== Conditional jump or move depends on uninitialised value(s)
==91702== at 0x100011507: strlen (mc_replace_strmem.c:282)
==91702== by 0x1000AA338: puts (in /usr/lib/libSystem.B.dylib)
==91702== by 0x100000EFA: main (valgrind_test.c:10)
==91702== Uninitialised value was created by a heap allocation
==91702== at 0x100010345: malloc (vg_replace_malloc.c:236)
==91702== by 0x100000EEA: main (valgrind_test.c:8)
這似乎是一個誤報給我,但我不夠自信在我自己的知識寫下來。也許我分配錯誤或使用strncpy錯誤?我不確定。
在此先感謝
你的字符串沒有終止符,所以valgrind可能是正確的,當它抱怨。 – 2011-06-14 15:38:27
在這裏使用snprintf會更好恕我直言。 snprintf(test,3,「123」); – puffadder 2011-06-14 15:41:40