📜  realloc in - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:47:02.306000             🧑  作者: Mango

realloc in C 编程语言

在 C 编程语言中,realloc() 函数可以重新分配已经分配的内存大小,它是 $stdlib.h$ 头文件中的一个函数。realloc() 函数需要两个参数:指向已分配内存的指针和新的内存大小。它返回一个指向新分配内存的指针。下面是函数签名:

void *realloc(void *ptr, size_t size);

其中 *ptr 参数是之前 malloc() 或 calloc() 函数分配内存时所返回的指针,而 size 参数是你期望这些内存块现在应该有多大。

如果 ptrNULL,那么 realloc() 就会分配一个新的内存块,就像 malloc() 函数一样。要注意,你必须检测这个指针的返回值是否为 NULL。如果分配失败了,realloc() 函数会返回 NULL 值。

如果 size 是0,那么realloc()函数将释放这个内存块。

如果 size 是在堆栈中分配的内存块的大小;则 realloc() 函数将会这些内存块扩大或缩小为 size 参数指定的大小。

下面是一些代码片段,演示了 realloc() 函数的用法:

扩大内存块
#include <stdio.h> 
#include <stdlib.h> 
  
int main() 
{  
    // 分配初始内存 
    int *ptr = (int*)malloc(5*sizeof(int)); 
  
    // 打印初始内存 
    for (int i=0; i<5; i++) 
         printf("%d ", *(ptr+i)); 
   
    // 重新分配内存 
    ptr = realloc(ptr, 15*sizeof(int)); 
   
    // 分配新的内存块 
    for (int i=5; i<15; i++) 
         *(ptr+i) = i; 
   
    // 打印新的内存块 
    for (int i=0; i<15; i++) 
         printf("%d ", *(ptr+i)); 
             
    free(ptr); 
   
    return 0; 
} 

当程序运行时,输出结果如下所示:

0 0 0 0 0
0 0 0 0 0 5 6 7 8 9 10 11 12 13 14 

在此示例中,我们从开始分配了一个大小为5的整型数组。接着,我们通过 realloc() 函数来扩大内存块的大小,将它扩大到了15个整型数字。最后,我们将新分配的数组打印出来。

缩小内存块
#include <stdio.h> 
#include <stdlib.h> 
  
int main() 
{  
    // 分配初始内存 
    int *ptr = (int*)malloc(15*sizeof(int)); 
  
    // 打印初始内存 
    for (int i=0; i<15; i++) 
         printf("%d ", *(ptr+i)); 
   
    // 重新分配内存 
    ptr = realloc(ptr, 5*sizeof(int)); 
      
    // 打印新的内存块 
    for (int i=0; i<5; i++) 
         printf("%d ", *(ptr+i)); 
             
    free(ptr); 
   
    return 0; 
} 

当程序运行时,输出结果如下所示:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0

在此示例中,我们从开始分配了一个大小为15的整型数组。接着,我们通过 realloc() 函数来缩小内存块的大小,将它缩小到了5个整型数字。最后,我们将缩小内存块的结果打印出来。

分配失败
#include <stdio.h> 
#include <stdlib.h> 
  
int main() 
{  
    // 分配初始内存 
    int *ptr = (int*)malloc(5*sizeof(int)); 
  
    // 打印初始内存 
    for (int i=0; i<5; i++) 
         printf("%d ", *(ptr+i)); 
   
    // 重新分配内存 
    ptr = realloc(ptr, 100*sizeof(int)); 
   
    if(ptr == NULL) 
    { 
        printf("\nCouldn't reallocate memory, exiting..."); 
        exit(0); 
    } 
   
    // 分配新的内存块 
    for (int i=5; i<100; i++) 
         *(ptr+i) = i; 
   
    // 打印新的内存块 
    for (int i=0; i<100; i++) 
         printf("%d ", *(ptr+i)); 
             
    free(ptr); 
   
    return 0; 
} 

当程序运行时,输出结果如下所示:

0 0 0 0 0
Couldn't reallocate memory, exiting...

在此示例中,我们从开始分配了一个大小为5的整型数组。接着,我们通过 realloc() 函数来扩大内存块的大小,将它扩大到了100个整型数字。由于内存不足,分配失败,所以我们在这个示例程序中使用了 exit(0); 语句来退出程序。

总结

在 C 编程语言中,realloc() 函数用于重新分配已经分配的内存大小。它有两个参数:指向已分配内存的指针和新的内存大小。如果需要的话,realloc() 函数会重新分配内存块的大小。它返回一个指向新分配内存的指针。需要注意的是,在通过 realloc() 函数重新分配内存块之后,原始内存块应该被释放(使用 free() 函数),这样可以释放内存并避免内存泄漏。