2012-11-12 129 views
2

我有以下代码在使用asprintfrealloc时都不起作用。asprintf覆盖内存realloc

我得到的错误是:

*** 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); 
} 
+0

当你的问题在这里得到解决时,不要改变你的帖子的名字,以便在你的问题中包括'(回答)'。只需通过解决问题的答案单击复选标记 – Mike

回答

5

此:

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

行经未初始化指针realloc(),这是错误的原因。

另外:

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

而不是使用reallocNULL或者未初始化的第一个参数,只需用malloc开始。

如果realloc调用是必要的IFs[ifCount - 1] = (char*) realloc(...)通话,然后前行,用calloc代替 - 这将超出分配的内存至少为零,从而realloc给予适当NULL指针。

+1

不,使用初始化为all-bits-zero的calloc()对指针无效。不能保证all-bits-zero是适用于NULL指针的内存模式。 – unwind

+0

感谢您的澄清 - 赞赏。 – prprcupofcoffee