打印分配的字符串时,valgrind报告错误
代码在这里:
#include #include #include int main() { char* buf = malloc(3); strcpy(buf, "hi"); printf("%s\n", buf); free(buf); }
它编译为:
gcc ac && valgrind ./a.out
错误消息在这里:
==1421== Memcheck, a memory error detector ==1421== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==1421== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==1421== Command: ./a.out ==1421== ==1421== Invalid read of size 8 ==1421== at 0x4EA96C1: ??? (in /lib/libc-2.14.1.so) ==1421== by 0x4E92D3B: puts (in /lib/libc-2.14.1.so) ==1421== by 0x4005BB: main (in /home/peter/a.out) ==1421== Address 0x51b4040 is 0 bytes inside a block of size 3 alloc'd ==1421== at 0x4C2740D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==1421== by 0x400595: main (in /home/peter/a.out) ==1421== hi ==1421== ==1421== HEAP SUMMARY: ==1421== in use at exit: 0 bytes in 0 blocks ==1421== total heap usage: 1 allocs, 1 frees, 3 bytes allocated ==1421== ==1421== All heap blocks were freed -- no leaks are possible ==1421== ==1421== For counts of detected and suppressed errors, rerun with: -v ==1421== ERROR SUMMARY: 2 errors from 1 contexts (suppressed: 6 from 6)
如果我使用以下(仅一个空格),valgrind报告不再有错误也是非常奇怪的:
printf("%s \n", buf);
有人可以帮帮我吗?
这是一个错误,但在所有计算机上都不可重现。
在某些机器上,gcc使用例如puts()
来优化简单的printf()
,这可能涉及无效读取(或者只是valgrind认为如此)。
如果真的很重要,你可以“复杂化” printf
格式。 %s
和\n
之间的空格可以。
这是一个类似的错误: C字符串,strlen和Valgrind
这个答案结合了讨论中的评论。 谢谢你们!
我在自己的机器上运行它,我没有错误:
==61755== Memcheck, a memory error detector ==61755== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==61755== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info ==61755== Command: ./a.out ==61755== hi ==61755== ==61755== HEAP SUMMARY: ==61755== in use at exit: 0 bytes in 0 blocks ==61755== total heap usage: 1 allocs, 1 frees, 3 bytes allocated ==61755== ==61755== All heap blocks were freed -- no leaks are possible ==61755== ==61755== For counts of detected and suppressed errors, rerun with: -v ==61755== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)