C 的 realloc 如何区分 int 数组和单个 int?
How does C's realloc differentiate between an array of ints and a single int?
因为数组只是相同类型的连续数据,你不需要明确地把 []
放在某个地方(例如你可以 int *p1 = malloc(sizeof(int) * 4);
,当你 realloc(p1, ...)
,它知道移动(如果它必须移动)恰好等于 space 的 4 个整数,即使内存中可能还有其他整数?
澄清问题:如果您以这种方式分配一个数组,并且只分配一个单独的 int - 这是否意味着这 4+1 个总 int 是 never在内存中是连续的,还是内存块中的“它是一个数组”信息以某种方式存在(例如,它们有某种定界符?),或者编译器是否从 malloc
参数中推断并记住了这一点?或者别的什么?
基本上,它如何确保它只移动且恰好移动这 4 个内存块,即使有其他相同大小的内存块可能也是连续的?
realloc
仅在传递指向 malloc
例程家族成员分配的内存的指针(或空指针)时定义。这些例程记录它们分配的内存。当您调用 realloc
时,它会使用这些记录来了解分配的块有多长。
通常,一个内存块的主记录被放入该块之前的字节中,因此 realloc
所要做的就是获取您给它的指针,从中减去已知数量的字节它,并查看该新地址的数据,它将在其中找到有关已分配块大小的信息。但是,其他方法也是可能的。
因为数组只是相同类型的连续数据,你不需要明确地把 []
放在某个地方(例如你可以 int *p1 = malloc(sizeof(int) * 4);
,当你 realloc(p1, ...)
,它知道移动(如果它必须移动)恰好等于 space 的 4 个整数,即使内存中可能还有其他整数?
澄清问题:如果您以这种方式分配一个数组,并且只分配一个单独的 int - 这是否意味着这 4+1 个总 int 是 never在内存中是连续的,还是内存块中的“它是一个数组”信息以某种方式存在(例如,它们有某种定界符?),或者编译器是否从 malloc
参数中推断并记住了这一点?或者别的什么?
基本上,它如何确保它只移动且恰好移动这 4 个内存块,即使有其他相同大小的内存块可能也是连续的?
realloc
仅在传递指向 malloc
例程家族成员分配的内存的指针(或空指针)时定义。这些例程记录它们分配的内存。当您调用 realloc
时,它会使用这些记录来了解分配的块有多长。
通常,一个内存块的主记录被放入该块之前的字节中,因此 realloc
所要做的就是获取您给它的指针,从中减去已知数量的字节它,并查看该新地址的数据,它将在其中找到有关已分配块大小的信息。但是,其他方法也是可能的。