我使用以下代码在同时使用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 :(得分:5)
此:
IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message));
将未初始化的指针传递给realloc()
,这是导致错误的原因。
此外:
strlen(message)
个字符,这个字符太少了。这将导致strcpy()
在复制时执行缓冲区溢出。realloc()
与分配堆内存的所有函数一样,可能会失败。对于asprintf()
也是如此。realloc()
in C。sizeof (char)
,因为它始终为1,因此它对代码的贡献非常小。答案 1 :(得分:0)
不要将realloc
与NULL
或未初始化的第一个参数一起使用,而只需使用malloc
开头。
如果在realloc
调用中需要IFs[ifCount - 1] = (char*) realloc(...)
调用,那么在上一行中使用calloc
代替 - 这将至少将分配的内存清零,以便{{1给出了一个正确的realloc
指针。