gpt4 book ai didi

c - asprintf 为 realloc 覆盖内存

转载 作者:行者123 更新时间:2023-12-02 05:24:20 25 4
gpt4 key购买 nike

我有以下代码在同时使用 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);
}

最佳答案

这个:

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,所以它给代码增加的值(value)很小。

关于c - asprintf 为 realloc 覆盖内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com