那么realloc如何(和如果)增加了这个循环中指向的内存。
char* buffer = malloc(sizeof(char));
ssize_t size = 0;
while(true)
{
//increment size;
size++;
// increment buffer_inc memory size by size (one byte at a time)
buffer = realloc(buffer, size);
......
当我执行此操作时,我认为我的初始sizeof(buffer)
为8
,在循环之后,我的尺寸仍为8
,不应该是9
?
奇怪的是,即使我buffer = realloc(buffer, size + sizeof(char);
我仍然认为sizeof(buffer)
(循环之后)8
上的价值我错过了关于realloc如何工作的内容?在我的理解中,它为size_t size
中传递的内存(作为第一个参数)分配了更多内存,其数量为void* ptr
(作为第二个参数传递)。
我是否误解了realloc的工作原理?
答案 0 :(得分:3)
A:否,但你误解了你要打印的内容!
您正在打印指针的大小。
因此,对于32位计算机,指针大小可以是4个字节; 64位计算机可以有8个字节。或者,运行32位操作系统的64位计算机将具有4个字节。但是,在特定的体系结构下,所有类型的指针(void *,int *,char *,long *等)都具有相同的大小(函数指针除外)。
检查此示例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char* buf1 = malloc(sizeof(char));
printf("buf1 = %zu\n", sizeof(buf1));
char* buf2 = malloc(1000 * sizeof(char));
printf("buf2 = %zu\n", sizeof(buf2));
return 0;
}
输出:
gsamaras@gsamaras:~/Desktop$ ./a.out
buf1 = 8
buf2 = 8
您无法打印已分配的内存量。通过在示例中保留一个额外的变量size
,跟踪他已分配的内存是程序员的责任。
答案 1 :(得分:2)
你不是误解realloc
。你误解了sizeof
。
sizeof(buffer)
是指针的大小(对你而言似乎是8),而不是它所指向的缓冲区的大小。你必须自己跟踪分配的大小。