我有这些变量:
uint32_t fsize;
char *filebuffer = NULL;
fsize = fileStat.st_size;
如果我想malloc正确的内存,我必须编写的代码是这样的:
malloc(fsize);
或这个:
malloc(fsize * sizeof(char *));
谢谢!
sizeof(char*)
是指针的大小,这可能不是您想要的。按名称,我假设这fsize
是文件的大小(以字节为单位),所以很老
malloc(fsize);
很好。
malloc()
分配指定的字节数。如果您要调用malloc(fsize * sizeof(char *))
,您将分配太多内存,因为您将所需的字节数 ( fsize
) 乘以一个额外的因子,sizeof(char*)
即存储指针所需的字节数(通常为 4 或 8 个字节) .
char*
在决定分配多少字节时,您最终将分配的内存分配给指针这一事实无关紧要。
你写了:
如果我想 malloc 正确的内存,我必须编写的代码是这样的:
malloc(fsize); 或这个:
malloc(fsize * sizeof(char *));
这两个语句之间的区别是 malloc(fsize) 给你足够的内存来存储文件中的字符, malloc(fsize * sizeof(char *)) 给你足够的内存来存储足够多的指针的地址来指向每个字符在文件中。
我想你要问的是:
“或者这个:malloc(fsize * sizeof(char));”
换句话说,我是否想将文件中的字符数乘以每个字符的大小,这是一个合理的问题,但对于字符来说它是无关紧要的,因为 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)。
希望这有助于澄清答案。
malloc(size) 函数分配一个 size 字节的内存块,返回一个指向块开头的指针。像这样:
uint32_t fsize = fileStat.st_size;
char* filebuffer = (char*)malloc(fsize);
不要忘记
free(filebuffer);