C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配

数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了。但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略。

其实,作为独立的一章,本章显得内容不多。malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱。

总结:

malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针。malloc返回的是一个 void *的指针。

malloc的参数就是需要分配的内存的字节数。calloc的参数是个数*单位长度。

realloc函数可以改变一块已经动态分配内存的大小。

void *malloc(size_t size); 或者 void *malloc((num) * sizeof(...))

void free(void *pointer);

void *calloc(size_t num_elements, size_t element_size);

void realloc(void *ptr, size_t new_size);

如果realloc的第一个参数是ptr == NULL,那么它的返回值和malloc一模一样,一个NULL的指针。

当一块内存不再使用时,应该调用free函数归还给内存池。但是如果不是malloc、calloc或者realloc函数返回的,它是不能作为参数传递给free。

内存泄露是指内存被动态分配以后,它不再使用时未被释放。内存泄露会增加程序的体积。

警告:

1、不检查从malloc函数返回的指针是否为NULL。

#include <stdlib.h>

#include <stdio.h>

array = malloc(10 * sizeof( int ));

if(array == NULL)

exit (EXIT_FAILURE);

2、访问动态分配的内存之外的区域。

3、向free函数传递一个并非由malloc函数返回的指针。

根本不会有作用。

4、在动态内存被释放之后再访问它。

编程提示:

1、动态内存分配有助于消除程序内部存在的限制。

2、使用sizeof计算数据类型的长度,提高程序的可移植性。

当32位机、16位机时候,int是不同字节数的。因此最好sizeof(int)。

时间: 2024-10-20 19:02:18

C和指针 (pointers on C)——第十一章:动态内存分配(上)的相关文章

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

动态内存分配与指向它的指针变量

1.动态内存分配的含义 c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用. 2.建立内存的动态分配 对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

未解决问题:指针作参数、二重指针、指针数组、动态内存分配

题目:输入m个学生n门课的成绩,计算每个学生的平均成绩,输入学生编号后输出该学生各门课的成绩. 先直接上源码:(有错误的源码) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int **pointer_counterpart = NULL; int main() { void Input_number(int *m, int *n); //输入m个学生n门课成绩 void allocation(i

指针做参数的动态内存分配与二重指针(下)

要实现指针作为函数形参,改变实参指针的值.一般有两种做法: 使用双指针,或者指针数组形式作为形参,将实参的地址传入函数,也即要给形参传入指针的地址! http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe http://www.cnblogs.com/heat-man/p/4646051.html http://www.jb51.net/a

第十二章 动态内存与智能指针

动态内存与智能指针 [智能指针]头文件#include<memory>shared_ptr: 允许多个指针指向同一个对象unique_ptr: "独占"所指向的对象weak_ptr:伴随类,它是一种弱引用,指向shared_ptr所管理的对象. 原文地址:https://www.cnblogs.com/sunbines/p/8552298.html

C和指针 (pointers on C)——第十一章:动态内存分配(下)习题

1.编写calloc,内部用malloc. void *calloc (size_t n, size_t size) { char * memory; memory =(char*) malloc(n * size); while( memory != NULL) { char * ptr; ptr = memory; while ( --n >= 0) { *ptr++ = '\0'; } } return memory; } 2.编写一个函数,动态存储一列输入的整数. #include <