【发布时间】:2021-05-15 18:05:09
【问题描述】:
我正在尝试连接在执行代码时传递的所有argv[] 参数的内容。这里的计数与argc 相同。 **文件包含argv。
char *merge_everything(int count, char **files) {
size_t size = 0;
char *buf = NULL;
buf = malloc((size + 1) * sizeof(*buf)); /* size + 1 byte for the \0 */
if (buf == NULL) {
printf("MALLOC ERROR\n");
exit(1);
}
char *temp = buf;
for (int i = 0; i < count - 1; i++) {
FILE *f = fopen(files[i], "rb");
fseek(f, 0, SEEK_END);
long bytes = ftell(f);
fseek(f, 0, SEEK_SET);
fread(temp, (size_t) bytes, 1, f);
temp += bytes;
fclose(f);
}
*temp = 0;
free(buf); //If I don't free buf here then memory leak? If I do temp has null?
return temp; //temp has all the concatenated stuff
}
我处于两难境地,最后释放buf 在return 语句之前。
请帮我纠正方法。
我热衷于使用缓冲区(通过malloc)而不是将其写入新文件。因此,这种方法。
【问题讨论】:
-
如果我不在这里释放 buf 则内存泄漏。首先,您应该返回
buf而不是temp,因为前者是字符串的开头,而后者位于字符串的中间。其次,如果这样做了,那么它就不是内存泄漏,因为调用者负责释放。 -
您是否意识到您分配的内存量与任何一个文件的大小都没有关系,更不用说所有文件了?
-
size_t size = 0; malloc((size + 1) * sizeof(*buf));你认为分配了多少内存? -
没有分配任何内容。我意识到了这一点,而不是给它一个像 512 之类的硬编码宏。我希望它适应文件 1 的大小,然后适应文件 2 的大小等等。
-
很公平。但这不会神奇地发生。执行此操作的代码在哪里?一旦分配完成,它就不会自动改变大小。
标签: arrays c malloc concatenation file-handling