我正在为学校编写一些代码,这里是我遇到问题的代码片段:
// 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/")
,我得到了我正在寻找的功能。谢谢!
答案 0 :(得分:3)
char* path = malloc(size_path*sizeof(char));
path = "./storage/\0";
所以路径指向一些动态分配的内存,然后在下一行你说path = something_else
所以:
free
)realloc
非动态记忆在问题的界限之间阅读,我建议你甚至根本不需要动态记忆。您可以使用固定大小的缓冲区:
char path[128]; // arbitrary limit that we "know" is ok given our data
char* filename = "test.txt";
sprintf(path, "/storage/%s", filename);
显然,这是为了假设文件名实际上可以根据某些数据而改变,否则整个批次可能是一个文字字符串。