如何建立内存的动态分配

简介: 如何建立内存的动态分配


在编程中,内存的动态分配是一个重要的概念,它允许我们在运行时根据需要为变量分配内存空间。这种技术特别适用于那些大小在程序执行前无法确定的数据结构,如动态数组、链表等。在C语言中,内存的动态分配主要通过malloccallocreallocfree这四个函数来实现。

1. malloc函数

malloc函数用于在堆上分配指定字节大小的内存空间,并返回一个指向该内存空间的指针。如果分配成功,则返回非空指针;否则返回空指针NULL

示例代码:

c复制代码


  #include <stdio.h> 
  #include <stdlib.h> 
  
  int main() { 
  int n = 5; // 假设我们需要一个大小为5的整数数组 
  int *array = (int *)malloc(n * sizeof(int)); // 分配内存 
  
  if (array == NULL) { // 检查分配是否成功 
  printf("Memory allocation failed.\n"); 
  return 1; 
  } 
  
  // 使用分配的内存 
  for (int i = 0; i < n; i++) { 
  array[i] = i * 2; 
  } 
  
  // 打印数组内容 
  for (int i = 0; i < n; i++) { 
  printf("%d ", array[i]); 
  } 
  printf("\n"); 
  
  // 释放内存 
  free(array); 
  
  return 0; 
  }

2. calloc函数

calloc函数与malloc类似,但它还会将分配的内存空间初始化为0。它的第一个参数是元素个数,第二个参数是每个元素的大小(以字节为单位)。

示例代码:

c复制代码

  #include <stdio.h> 
  #include <stdlib.h> 
  
  int main() { 
  int n = 5; // 假设我们需要一个大小为5的整数数组 
  int *array = (int *)calloc(n, sizeof(int)); // 分配并初始化内存 
  
  if (array == NULL) { // 检查分配是否成功 
  printf("Memory allocation failed.\n"); 
  return 1; 
  } 
  
  // 使用分配的内存(这里不需要手动初始化,因为calloc已经做了) 
  // ... 
  
  // 释放内存 
  free(array); 
  
  return 0; 
  }

3. realloc函数

realloc函数用于改变已分配内存块的大小。如果扩大内存块成功,则返回指向新内存块的指针;如果缩小内存块或内存不足,则返回指向原内存块的指针;如果失败,则返回空指针NULL

示例代码:

c复制代码

  #include <stdio.h> 
  #include <stdlib.h> 
  
  int main() { 
  int n = 5; // 初始数组大小 
  int *array = (int *)malloc(n * sizeof(int)); // 分配内存 
  
  // ... 假设已经填充了数组内容 ... 
  
  n *= 2; // 将数组大小扩大一倍 
  array = (int *)realloc(array, n * sizeof(int)); // 重新分配内存 
  
  if (array == NULL) { // 检查重新分配是否成功 
  printf("Memory reallocation failed.\n"); 
  // 注意:这里应该处理原始数据,因为它们可能仍然占用内存 
  free(array); // 释放原始内存(如果realloc失败) 
  return 1; 
  } 
  
  // 使用新的内存空间(比如填充新元素) 
  // ... 
  
  // 释放内存 
  free(array); 
  
  return 0; 
  }

4. 注意事项

分配的内存必须在使用完毕后释放,以避免内存泄漏。

使用malloccallocrealloc分配内存后,应当检查返回的指针是否为NULL,以确保分配成功。

使用free释放内存后,应当将指针设置为NULL,以避免成为悬挂指针(dangling pointer)。

尽量避免对已经释放的内存进行访问,这可能导致程序崩溃或不可预知的行为。

通过合理使用这些内存管理函数,我们可以编写出更加灵活和高效的程序。

 







目录
相关文章
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
105 13
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
80 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
60 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
4月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
5月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
138 8
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
5月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
26 1
|
4月前
|
存储 NoSQL Java
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
|
7月前
|
C语言
内存的动态分配
内存的动态分配
48 2