realloc如何处理增加内存块大小的问题?

时间:2016-02-17 11:15:21

标签: c memory-management malloc sizeof realloc

那么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的工作原理?

2 个答案:

答案 0 :(得分:3)

问:我是否误解了realloc的工作原理?

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),而不是它所指向的缓冲区的大小。你必须自己跟踪分配的大小。