c - Valgrind 中未初始化字节错误

标签 c memory 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)

我认为该错误是由于当我第一次调用 printfmyString 为“空”,但是,我不确定怎么解决。

谢谢!

最佳答案

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

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

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

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

char myString[50] = {0};

关于c - Valgrind 中未初始化字节错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716710/

相关文章:

c - 初始化内部带有 union 的结构后为 "incompatible types when initializing type"

c - 为什么我们在处理 TSR 时需要远指针?

c++ - localtime_r 在程序退出前消耗了一些内存

memory - 为什么堆栈会溢出?

c++ - std::locale 导致 Helgrind 出错

c - "Conditional jump or move depends on uninitialised values"释放字符时 **

根据两个输入计算纸币和硬币的变化

c++ - OpenCV 类型独立图像访问的最佳方式?

c - Valgrind:地址 0x0 未被堆叠、分配或(最近)释放仅用于较大的输入值

javascript - Chrome 中的 FileReader 内存泄漏