我有这些变量:
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( 函数分配一个大小字节的内存块,返回指向块开头的指针。喜欢这个:
uint32_t fsize = fileStat.st_size;
char* filebuffer = (char*)malloc(fsize);
不要忘记
free(filebuffer);