簡體   English   中英

Valgrind中的未初始化字節錯誤

[英]Uninitialized bytes error in Valgrind

我是C語言的新手,我正在與Valgrind一起做一些練習。

我的代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i;
    int ints[10];
    char myString[50]; 

    for (i=0; i<=10; i++) {
        ints[i] = rand() % 10;
    }

    printf("''string'' is %lu characters long\n", strlen(myString));
    strcpy(myString, "This is a medium sized string");
    printf("''string'' is %lu characters long\n", strlen(myString));

    return 0;
}

我的Valgrind輸出:

==5425== Syscall param write(buf) points to uninitialised byte(s)
==5425==    at 0x260E9A: write$NOCANCEL (in /usr/lib/system/libsystem_kernel.dylib)
==5425==    by 0x17E5E8: __sflush (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x180CAA: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x18B191: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x1AF2DA: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x1AF6AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x186B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x18496F: printf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x100000E73: main (test.c:15)
==5425==  Address 0x10001236e is 14 bytes inside a block of size 4,096 alloc'd
==5425==    at 0x6DEB: malloc (in /usr/local/Cellar/valgrind/3.9.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5425==    by 0x181855: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x196217: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x1AF158: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x1AF6AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x186B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x18496F: printf (in /usr/lib/system/libsystem_c.dylib)
==5425==    by 0x100000E73: main (test.c:15)
==5425==  Uninitialised value was created by a stack allocation
==5425==    at 0x100000DF0: main (test.c:6)

我以為該錯誤是由於在我進行第一個printf調用時myString是“空”的事實引起的,但是,我不確定如何解決它。

謝謝!

當您在此處進行strlen調用時,字符串myString未初始化:

printf("''string'' is %lu characters long\n", strlen(myString));

strlen函數通過myString搜索'\\0' ,它將讀取未初始化的數據。 這就是觸發valgrind中的錯誤的原因。

要解決此問題,請添加初始化:

char myString[50] = {0};

我認為該錯誤是由於myString為“空”

並不是的。 myString不為空,未初始化,其內容未定義,因此使用strlen(myString)是非法的。

您可以將其初始化為一個空字符串,如下所示:

char myString[50] = ""; 

不能說myString為空,它有一些內容。 只是內容是任意的。

這意味着在該處可能沒有零字節來終止該字符串,因此在其上調用printfstrlen 並不是一個好主意,因為它可能跑出緩沖區的末端並引起問題。

您可以通過確保它是有效的字符串來簡單地使其工作,例如:

*myString = '\0';

暫無
暫無

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

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