我有这些变种:
uint32_t fsize;
char *filebuffer = NULL;
fsize = fileStat.st_size;
如果我想到malloc 正确的内存,我必须编写的代码是:
malloc(fsize);
或者这个:
malloc(fsize * sizeof(char *));
谢谢!
答案 0 :(得分:5)
sizeof(char*)
是指针的大小,可能不是你想要的。按照名称,我假设fsize
是文件的大小(以字节为单位),所以很简单
malloc(fsize);
很好。
malloc()
分配指定的字节数。如果您要调用malloc(fsize * sizeof(char *))
,那么您将分配太多内存,因为您将所需的字节数(fsize
)乘以一个额外的因子sizeof(char*)
,这是存储指针所需的字节数(通常为4或8个字节)。
在决定分配多少字节时,最终将分配的内存分配给char*
指针这一事实无关紧要。
答案 1 :(得分:1)
您写道:
如果我想要正确的内存,我必须编写的代码是 这样:
的malloc(FSIZE);或者这个:
malloc(fsize * sizeof(char *));
这两个语句之间的区别是malloc(fsize)给你足够的内存来存储文件中的字符,malloc(fsize * sizeof(char *))给你足够的内存来存储指向足够指针的地址到文件中的每个字符。
我认为你要问的是:
“或者:malloc(fsize * sizeof(char));”
换句话说,我想将malloc中文件中的字符数乘以每个字符的大小,这是一个合理的问题,但对于字符而言,它是无关紧要的,因为sizeof(char)= 1.所以让我们说你的文件是文字,里面有4个字母:
malloc(fsize) == malloc(4)
malloc(fsize * sizeof(char)) == malloc(4 * 1) == malloc(4)
malloc(fsize * sizeof(char *)) == malloc(4 * 4) == malloc(16)
4的原因是因为你没有得到数据的大小,而是以字节为单位的地址大小(例如:0x0035F900)。
希望有助于澄清答案。
答案 2 :(得分:0)
malloc(size)函数分配一个大小为内存字节的块,返回指向块开头的指针。像这样:
uint32_t fsize = fileStat.st_size;
char* filebuffer = (char*)malloc(fsize);
并且不要忘记
free(filebuffer);