C中的realloc - 确切的行为和用法

nar*_*shi 1 c conceptual dynamic-memory-allocation

阅读一些文献,我能够掌握realloc一个void指针和一个大小变量,并重新分配void指针所指向的块的内存.

  • 如果realloc在具有int *字符大小的整数指针()上调用会发生什么?反之亦然.

  • 这有什么可能的应用?(一个例子肯定会有所帮助.)

Jon*_*ler 7

realloc()功能是一体化内存管理系统.

  • 如果使用空指针和非零大小调用,则会分配内存.
  • 如果使用有效指针和零大小调用,则释放内存.
  • 如果使用有效指针和非零大小调用,则会更改已分配内存的大小.

如果realloc()使用无效指针调用- 无法从中获取malloc(),calloc()或者realloc()- 则会得到未定义的行为.

您可以将realloc()整数指针传递给已分配的sizeof(char)字节空间(1个字节),但您将面临调用未定义行为的危险.问题不在于realloc(); 它是给代码一个不可用的整数指针.由于只分配了1个字节,但是sizeof(int)大于1(基本上所有系统都有;可能有异常,但对于提出这个问题的人没有),没有安全的方法来使用该指针,除非将其传递给free()realloc().

鉴于:

int *pointer = malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)

你不能这样做,*pointer = 0;因为没有足够的空间(正式)分配给它.你不能这样做,int x = *pointer;因为没有足够的空间(正式)分配它来读取."正式"这个词是存在的,因为在实践中,内存分配器分配一个最小大小的块,通常是8或16个字节,所以在一个字节后实际上有空格.但是,你的步骤超出了标准所保证的范围,并且可以设想内存分配器只需要一个字节.所以,不要冒风险.除了作为内存分配函数的参数之外,指向已分配内存的单个字节的整数指针是不可用的.

第一个参数realloc()是a void *.由于你将在scope(#include <stdlib.h>)中有一个原型,编译器会将其转换int *为a void *(如果有任何东西要做这样的转换),只要指定的空间被分配,一切都会好的; realloc()将更改分配大小,可能返回相同的指针或可能返回不同的指针,或者如果新大小为零字节,它将释放空间.