【问题标题】:Uninitialized bytes error in ValgrindValgrind 中的未初始化字节错误
【发布时间】:2025-12-14 18:55:01
【问题描述】:

我是 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)

我认为该错误是由于我第一次拨打printfmyString 是“空”的,但是我不确定如何解决它。

谢谢!

【问题讨论】:

    标签: c memory valgrind


    【解决方案1】:

    当您在此处调用strlen 时,字符串myString 未初始化:

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

    strlen 函数通过myString 搜索'\0' 时,它会读取未初始化的数据。这就是触发 valgrind 错误的原因。

    要解决此问题,请添加初始化:

    char myString[50] = {0};
    

    【讨论】:

      【解决方案2】:

      我认为错误是由于 myString 是“空”的事实

      不是真的。 myString不为空,未初始化,内容未定义,使用strlen(myString)是非法的。

      你可以像这样将它初始化为一个空字符串:

      char myString[50] = ""; 
      

      【讨论】:

        【解决方案3】:

        myString 是空的不是真的,它有一些 内容。只是内容随意。

        这意味着它可能没有在某处有一个零字节来终止字符串,因此在其上调用printfstrlen不是一个好主意,因为它可能会超出缓冲区的末尾并导致问题。

        您可以通过确保它是一个有效的字符串来使其工作,例如:

        *myString = '\0';
        

        【讨论】: