繁体   English   中英

我不明白为什么我得到这个valgrind错误

[英]I don't understand why I get this valgrind error

我得到以下代码:

/* main.c */

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

int main (){
  int i;
  char *msg = "This is a simple and small message";
  int len = strlen (msg);
  char *new_msg = (char *) malloc (len);
  for (i = 0; i < len; i++)
    new_msg[i] = 'A';
  printf ("%s\n", new_msg);
  free (new_msg);
  return 0;
}

我编译它然后使用valgrind使用此命令运行它:

valgrind --leak-check=full --show-reachable=yes ./main

我得到了这个输出:

==8286== Memcheck, a memory error detector
==8286== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==8286== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==8286== Command: ./main
==8286== 
==8286== Invalid read of size 1
==8286==    at 0x4C2C1B4: strlen (vg_replace_strmem.c:412)
==8286==    by 0x4EA09FB: puts (ioputs.c:36)
==8286==    by 0x400636: main (main.c:12)
==8286==  Address 0x51de062 is 0 bytes after a block of size 34 alloc'd
==8286==    at 0x4C28C20: malloc (vg_replace_malloc.c:296)
==8286==    by 0x400601: main (main.c:9)
==8286== 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
==8286== 
==8286== HEAP SUMMARY:
==8286==     in use at exit: 0 bytes in 0 blocks
==8286==   total heap usage: 1 allocs, 1 frees, 34 bytes allocated
==8286== 
==8286== All heap blocks were freed -- no leaks are possible
==8286== 
==8286== For counts of detected and suppressed errors, rerun with: -v
==8286== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

我看到所有已分配的内存都已释放,但我仍然收到一个我不理解的错误。

感谢帮助。

这是一个非常简单的错误: new_msg读取无效,因为null终止符不存在。

你已经分配了char的数量等于原始字符串的长度,所以目前没有空间来适应'\\0'而不会产生未定义的行为。 按如下所示更改代码以解决问题:

char *new_msg = malloc (len+1);
for (i = 0; i < len; i++)
    new_msg[i] = 'A';
new_msg[len] = '\0';

您的代码中有许多内容需要更改。

1) len应该是size_t而不是int ,因为strlen()返回类型size_t

2) (char *) malloc (len); 放弃演员。 这不是错误,尽管有理由不应该施放。

3) new_msg不是NULL终止\\0 这就是错误发生的原因。

你使用strlen()来获取长度,但不包含'\\ 0'。
所以当你malloc一个新数组时,你应该使用len + 1 ,并设置new_msg[len]'\\0'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM