C中的realloc-精确行为和用途

C中的realloc-精确行为和用途,c,dynamic-memory-allocation,conceptual,C,Dynamic Memory Allocation,Conceptual,通过阅读一些文献,我能够理解realloc接收一个void指针和一个size变量,并重新分配void指针指向的块的内存 如果在整数指针int上调用realloc,会发生什么* 一个角色的大小?反之亦然 这可能的应用是什么?举个例子肯定会有帮助 realloc的第一个参数的类型是void*,正如您自己所说的。因此,您传递的函数参数将转换为空指针,这是一种隐式的安全转换 这与使用长int参数和int参数调用函数基本相同。realloc的第一个参数的类型是void*,正如您自己所说的。因此,您传递的函

通过阅读一些文献,我能够理解realloc接收一个void指针和一个size变量,并重新分配void指针指向的块的内存

如果在整数指针int上调用realloc,会发生什么* 一个角色的大小?反之亦然

这可能的应用是什么?举个例子肯定会有帮助


realloc的第一个参数的类型是void*,正如您自己所说的。因此,您传递的函数参数将转换为空指针,这是一种隐式的安全转换


这与使用长int参数和int参数调用函数基本相同。

realloc的第一个参数的类型是void*,正如您自己所说的。因此,您传递的函数参数将转换为空指针,这是一种隐式的安全转换


这与使用长int参数和int参数调用函数基本相同。

Realloc以字节为单位。如果你这样做

int* a= malloc(sizeof(int));
然后

a=realloc(a,1);

当然,a现在不够大,不能容纳int类型,在其中写入int会导致奇怪的行为。

Realloc以字节为单位。如果你这样做

int* a= malloc(sizeof(int));
然后

a=realloc(a,1);

当然,a现在对于int类型来说不够大,在其中写入int会产生奇怪的行为。

对于传递给realloc的非空指针有一个非常重要的要求:它们本身必须来自对malloc、calloc或realloc的调用,否则行为是未定义的

如果您分配了足够的内存块来存储int,然后为char分配realloc,那么您将始终返回相同的指针,因为sizeofchar小于或等于sizeofint:

如果换一种方式尝试,几乎肯定也会得到相同的指针,因为内存分配器很少(如果有的话)将内存打包到比sizeofint更小的块中。但是,结果取决于实现,因此理论上您可能会返回不同的地址


就上述任何练习的实用性而言,它都没有用处:realloc的设计意图是帮助您管理可变大小的数组,简化用于增加此类数组大小的代码,并可能减少分配和复制的数量。我看不出重新定位标量的理由。

对于传递给realloc的非空指针有一个至关重要的要求:它们本身必须来自对malloc、calloc或realloc的调用,否则行为是未定义的

如果您分配了足够的内存块来存储int,然后为char分配realloc,那么您将始终返回相同的指针,因为sizeofchar小于或等于sizeofint:

如果换一种方式尝试,几乎肯定也会得到相同的指针,因为内存分配器很少(如果有的话)将内存打包到比sizeofint更小的块中。但是,结果取决于实现,因此理论上您可能会返回不同的地址

就上述任何练习的实用性而言,它都没有用处:realloc的设计意图是帮助您管理可变大小的数组,简化用于增加此类数组大小的代码,并可能减少分配和复制的数量。我看不出重新分配标量的理由。

realloc函数是一体式内存管理系统

如果使用空指针和非零大小调用,它将分配内存。 如果使用有效指针和零大小调用,则会释放内存。 如果使用有效指针和非零大小调用,则会更改分配内存的大小。 如果您使用无效指针调用realloc(不是从malloc、calloc或realloc获得的指针),那么您将获得未定义的行为

您可以向realloc传递一个整数指针,指向sizeofchar bytes 1 byte的分配空间,但您将面临调用未定义行为的危险。问题不在于realloc;它与代码一起被赋予了一个不可用的整数指针。因为只分配了1个字节,但实际上所有系统上的sizeofint都大于1;也可能有例外,但对于提出这个问题的人来说,除了将指针传递给free或realloc之外,没有安全的方法来使用该指针

鉴于:

int *pointer = malloc(sizeof(char));
无法执行*指针=0;因为没有足够的空间正式分配给它进行写入。不能使用int x=*指针;因为没有足够的空间正式分配给它读取。“正式”一词之所以存在,是因为在实践中,内存分配器分配一个最小大小的块,通常是8或16字节,因此在一个字节之后实际上有空间。然而,您的内存分配超出了标准保证的范围,因此可以设想内存分配器只给您一个字节。 所以,不要冒险。指向已分配内存的单个字节的整数指针不可用,除非用作内存分配函数的参数

realloc的第一个参数是void*。因为您将在scope include中拥有一个原型,编译器将把int*转换为void*,如果有什么需要做的话,那么只要分配了指向的空间,一切都会很好;realloc将更改分配大小,可能返回相同的指针,也可能返回不同的指针,或者如果新大小为零字节,它将释放空间。

realloc功能是一体式内存管理系统

如果使用空指针和非零大小调用,它将分配内存。 如果使用有效指针和零大小调用,则会释放内存。 如果使用有效指针和非零大小调用,则会更改分配内存的大小。 如果您使用无效指针调用realloc(不是从malloc、calloc或realloc获得的指针),那么您将获得未定义的行为

您可以向realloc传递一个整数指针,指向sizeofchar bytes 1 byte的分配空间,但您将面临调用未定义行为的危险。问题不在于realloc;它与代码一起被赋予了一个不可用的整数指针。因为只分配了1个字节,但实际上所有系统上的sizeofint都大于1;也可能有例外,但对于提出这个问题的人来说,除了将指针传递给free或realloc之外,没有安全的方法来使用该指针

鉴于:

int *pointer = malloc(sizeof(char));
无法执行*指针=0;因为没有足够的空间正式分配给它进行写入。不能使用int x=*指针;因为没有足够的空间正式分配给它读取。“正式”一词之所以存在,是因为在实践中,内存分配器分配一个最小大小的块,通常是8或16字节,因此在一个字节之后实际上有空间。然而,您的内存分配超出了标准保证的范围,因此可以设想内存分配器只给您一个字节。所以,不要冒险。指向已分配内存的单个字节的整数指针不可用,除非用作内存分配函数的参数


realloc的第一个参数是void*。因为您将在scope include中拥有一个原型,编译器将把int*转换为void*,如果有什么需要做的话,那么只要分配了指向的空间,一切都会很好;realloc将更改分配大小,可能返回相同的指针,也可能返回不同的指针,或者如果新大小为零字节,它将释放空间。

正如dasblinkenlight所述,realloc对于标量没有意义。 在您的示例中:

int * a = malloc(sizeof(int));
int * b = realloc(a,sizeof(char));
将导致a==b,这仅仅是因为sizeofchar向未分配的空间写信就像放置定时炸弹,不知道它何时会爆炸。您应该只读取/写入分配的空间。

正如dasblinkenlight所述,realloc对于标量没有意义。 在您的示例中:

int * a = malloc(sizeof(int));
int * b = realloc(a,sizeof(char));
将导致a==b,这仅仅是因为sizeofchar向未分配的空间写信就像放置定时炸弹,不知道它何时会爆炸。您应该只读取/写入分配的空间。

它的内存是否不足,无法将int写入其中?@narendranathjoshi我认为现在对于int类型来说,它的内存不够大,相当于对于int类型来说,它的内存是否不足。@narendranathjoshi:是的。这就是LtWorf提到的奇怪行为的原因。将int写入like*a=42;在realloc之后,将意味着写入未分配的空间,这将导致未定义的行为。它的内存不足,无法将int写入其中吗?@narendranathjoshi我认为现在对于int类型来说不够大,相当于对于int类型来说,它的内存不足。@narendranathjoshi:是的。这就是原因
关于LtWorf提到的奇怪行为。将int写入like*a=42;在realloc之后,将意味着写入未分配的空间,这将导致未定义的行为。如果读取,它们本身必须来自对malloc、calloc、realloc或NULL值的调用。@WhozCraig是的,您是对的-NULL是绝对允许的;显然,来自realloc的结果也是允许的。谢谢如果读取,它们本身必须来自对malloc、calloc、realloc或NULL值的调用。@WhozCraig是的,您是对的-NULL是绝对允许的;显然,来自realloc的结果也是允许的。谢谢