【问题标题】:"realloc(): Invalid pointer" error“realloc():无效指针”错误
【发布时间】:2017-09-16 11:54:08
【问题描述】:

我正在为学校编写一些代码,这是我遇到问题的代码片段:

// Create file path
int size_path = 11;
char* path = malloc(size_path*sizeof(char));
path = "./storage/\0";
for(i = 0; i < size_filename; i++){
    size_path++;
    path = realloc(path, size_path*sizeof(char));
    path[size_path-1] = filename[i];
}
path[size_path] = '\0';

本质上,我正在做的是试图找到一个文件的存在(例如,test.txt),所以我需要使用access() 来检查它的存在,但首先我需要构建path本身就是path = "./storage/test.txt" 我已经使用上面的方法来解析一些其他的东西,所以我知道我这样做的方式,我只是觉得我在这里遗漏了一些东西,因为每当我尝试运行代码时,我在编译器中遇到错误:*** Error in ./a.out: realloc(): invalid pointer: 0x00000000004016c7 ***

我很想知道你们能提供什么见解,因为我已经在这个错误上工作了至少半个小时,而社区已经帮助我在几分钟内解决了许多问题,所以我'我敢肯定这只是一件事情,但我真的不知道它会在哪里。提前致谢!

编辑:正如我想象的那样,我在 5 分钟内得到了问题的答案。事实证明,我不小心泄漏了动态分配的内存,实际上并没有将任何东西放入其中并在之后直接静态分配它。相反,我使用了strcpy(path, "./storage/"),我得到了我正在寻找的功能。谢谢!

【问题讨论】:

  • 阅读How to Ask,特别是关于homework questions的部分。
  • path = "./storage/\0"; 分配了刚刚用 char* path = malloc(size_path*sizeof(char)); 初始化的 path,这会泄露之前的分配。
  • 大概path = "./storage/\0";应该是strcpy(path, "./storage/");
  • strcpy(path, "./storage/"); 效果与strcpy(path, "./storage/\0");相同
  • realloc(path, size_path*sizeof(char)); 对于最终的path[size_path] = '\0';来说太小了

标签: c memory realloc


【解决方案1】:
char* path = malloc(size_path*sizeof(char));
path = "./storage/\0";

所以 path 指向一些动态分配的内存,然后在下一行你说path = something_else 所以:

  1. 你泄露了动态分配的内存(因为你没有指向它的指针,所以无法通过free它访问它)
  2. 你不能realloc非动态内存

在问题的字里行间,我建议您甚至根本不需要动态内存。您可以只使用固定大小的缓冲区:

char path[128]; // arbitrary limit that we "know" is ok given our data
char* filename = "test.txt";
sprintf(path, "/storage/%s", filename);

显然,这是为了假设文件名实际上可以根据某些数据而改变,否则整个文件可能是一个文字字符串。

【讨论】:

  • 这正是我所想的,所以大概就像上面的评论者所说的那样,我应该使用strcpy() 将我想要的字符串放入分配的内存中。非常感谢!
  • 你真的需要动态内存吗?你当然不需要realloc。您可以使用固定大小的缓冲区作为起点...
  • 我想你是对的;我可以使用固定缓冲区并获得相同的结果。无论哪种方式,我很高兴我现在知道这个问题出现的未来
  • @M.M 缓冲区溢出在 cmets 中已“解决”。为什么你认为它会用空格截断文件名? scanf 可能会用空格做奇怪的事情,sprintf 不应该。
  • @John3136 我的错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多