我試圖編寫解決以下問題的函數(這是無關緊要的,我將其描述爲描述下面的代碼):在valgrind中,wprintf會引起「條件跳轉還是移動取決於未初始化的值」?
給定一個單詞和規則的形式:「lhs- > rhs「其中word = lhs ^後綴,輸出rhs ^後綴,例如:
如果一個單詞是」輸入「並且規則是」in-out「,則該函數將返回單詞」output「如果該規則不能用於該單詞,則爲NULL。
雖然有一個轉折:「lhs」可能還包含數字變量(除了字母),例如, G。 「01-> 10」,在這種情況下,該規則將在「niput」上使用時將「niput」轉換爲「input」(因此數字對應於站在特定位置的字母)。
下面的代碼:
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_WORD_SIZE 101
wchar_t *transform_by_rule(wchar_t *word, wchar_t *lhs, wchar_t *rhs)
{
int i;
long int wint;
int lhs_len = wcslen(lhs);
int rhs_len = wcslen(rhs);
int word_len = wcslen(word);
// Initial check - does lhs fit to word
if (word_len < lhs_len)
return NULL;
for (i = 0; i < lhs_len; i++)
{
if (iswdigit(lhs[i]))
continue;
else
{
if (lhs[i] != word[i])
return NULL;
}
}
wchar_t *result =
malloc((rhs_len + 1) * sizeof(wchar_t));
wchar_t int_wchar_map[10];
for (i = 0; i < lhs_len; i++)
{
if (iswdigit(lhs[i]))
{
wint = lhs[i] - L'0';
int_wchar_map[wint] = word[i];
}
}
for (i = 0; i < rhs_len; i++)
{
if (iswdigit(rhs[i]))
{
wint = rhs[i] - L'0';
result[i] = int_wchar_map[wint];
}
else
{
result[i] = rhs[i];
}
}
return result;
}
int main()
{
wchar_t word[MAX_WORD_SIZE];
wchar_t lhs[MAX_WORD_SIZE];
wchar_t rhs[MAX_WORD_SIZE];
wscanf(L"%ls", word);
wscanf(L"%ls", lhs);
wscanf(L"%ls", rhs);
wchar_t *result = transform_by_rule(word, lhs, rhs);
if (result != NULL)
{
wprintf(L"%ls\n", result); // line 67
free(result);
}
else
{
puts("Rule doesn't fit to word.");
}
return 0;
}
這裏的問題。當輸入 「A」(字), 「一」(左), 「B」(右),在Valgrind的輸出錯誤的valgrind下運行:
==6094== Conditional jump or move depends on uninitialised value(s)
==6094== at 0x4C30E19: wcslen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6094== by 0x4E8C3F6: vfwprintf (in /usr/lib64/libc-2.20.so)
==6094== by 0x4EA7448: wprintf (in /usr/lib64/libc-2.20.so)
==6094== by 0x4009AA: main (main.c:67)
我看不到我的代碼任何問題。這是wprintf()的問題嗎?
通常這個警告可以通過使用calloc()來解決 –