asprintf覆盖realloc的内存

时间:2012-11-12 15:17:26

标签: c printf realloc

我使用以下代码在同时使用asprintfrealloc时无效。

我得到的错误是:

*** glibc detected *** a.out: realloc(): invalid old size: 0x006f1430 ***

根据我的研究结果,当我使用asprintf时,它会覆盖realloc使用的一些内存。这对我来说没有意义,因为asprintf应该是安全的并且使用适当的字符串长度动态分配。不使用asprintf会导致程序正常运行,但我的项目需要asprintf的功能。

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

int main() {
  int ifCount = 1;
  int stringCount = 1;
  char** IFs = NULL;

  //Broken code
  char* message;
  asprintf(&message, "Hello: %d", stringCount);

  //Working code, but not the alternative I want to take
  //char* message = "Hello";

  IFs = (char**) realloc(IFs, sizeof(char*) * ifCount);
  IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message));
  strcpy(IFs[ifCount - 1], message);

  printf("Message: %s\n", message);
  printf("Copy: %s\n", IFs[ifCount - 1]);
  free(message);
}

2 个答案:

答案 0 :(得分:5)

此:

IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message));

将未初始化的指针传递给realloc(),这是导致错误的原因。

此外:

  1. 请记住,字符串需要终止空间,上面是分配strlen(message)个字符,这个字符太少了。这将导致strcpy()在复制时执行缓冲区溢出。
  2. 请记住,realloc()与分配堆内存的所有函数一样,可能会失败。对于asprintf()也是如此。
  3. Don't cast the return value of realloc() in C
  4. 避免使用sizeof (char),因为它始终为1,因此它对代码的贡献非常小。

答案 1 :(得分:0)

不要将reallocNULL或未初始化的第一个参数一起使用,而只需使用malloc开头。

如果在realloc调用中需要IFs[ifCount - 1] = (char*) realloc(...)调用,那么在上一行中使用calloc代替 - 这将至少将分配的内存清零,以便{{1给出了一个正确的realloc指针。