gpt4 book ai didi

C 缓冲内存分配

转载 作者:太空狗 更新时间:2023-10-29 15:16:48 25 4
gpt4 key购买 nike

我是 C 的新手,所以请原谅我的无能。我想将整个可执行文件读入缓冲区:

#include <stdlib.h>
FILE *file = fopen(argv[1], "rb");
long lSize;

fseek(file, 0, SEEK_END);
lSize = ftell(file);
fseek(file, 0, SEEK_SET);

char *buffer = (char*) malloc(sizeof(char)*lSize);
fread(buffer, 1, lSize, file);

文件有 6144 字节(正确存储在 lSize 中)但我的缓冲区大小只有 4 字节,因此只有 MZ 签名存储在缓冲区中。

为什么在这种情况下 malloc 只分配 4 个字节?

编辑:可能 char 缓冲区由 PE 文件的 MZ header 中的第一个 0 终止。但是,如果我将缓冲区设置为某个值,则会存储整个文件。如果我将缓冲区设置为 int(= 4 字节),缓冲区将不会终止,但当然会更大(相对于 char = 1 字节)。我只想用空字节逐字节复制文件。

编辑 2:缓冲区当然包含它应该包含的所有内容,但是如果我尝试使用 fwrite 将它写入一个新文件,它只会写入第一个\0(即 4 个字节)。我只是写错了。解决了这个问题。抱歉,问题定义不够明确。

最佳答案

如果 lSize 确实等于 6144 那么您的代码确实会分配 6144 字节,然后读取文件的全部内容。如果您认为只读取了 4 个字节,那可能是因为第 5 个字节为零。因此,当缓冲区被解释为零终止字符串时,它会在该点终止。

您可以通过查看 buffer[4]buffer[5] 等来检查缓冲区的其余部分。

顺便说一句,您不需要根据定义从 mallocsizeof(char) == 1 强制转换返回值。最佳做法是像这样编写 malloc:

char *buffer = malloc(lSize);

但这不会改变您的结果。

关于C 缓冲内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7777524/

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