C语言——mallo()函数

本文详细介绍了C语言中用于动态分配内存的两个重要函数:malloc()和calloc()。malloc()用于在堆区分配指定大小的内存空间,而calloc()不仅分配内存还将其初始化为0。文章解释了这两个函数的参数、返回值及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

malloc():动态分配内存存储空间

#include<stdlib.h>          //头文件
void *malloc(size_t size)  //原型

参数说明:size为需要分配的内存空间大小,单位是Byte
函数说明:在堆区分配一块size Byte大小的内存空间,用于存放数据,这块内存空间被分配后不会被初始化,因此这些内存空间对应的值是未知的。如果需要对分配的内存初始化,可以使用 calloc() 函数
返回值:分配成功返回指向分配的内存的指针,注意的是虽然该函数返回值类型是void *,void并不是指没有返回值或者空指针,而是返回指针类型未知,所以在使用malloc()函数经常要使用到强制类型转换
例如:
char *pr = (char *)malloc(10);

calloc()分配内存空间并初始化

 #include<stdlib.h>  //头文件
void *calloc(size_t size, size_t num);  //原型

参数说明:num为需要连续分配的空间的个数,size为每个分配空间的大小,单位Byte。
函数说明:在内存中动态分配num个长度为size Byte的连续的内存空间,并给每个字节都初始化为0。
返回值:分配成功返回指向该内存的地址,失败则返回NULL,同样和malloc()函数一样的是函数返回值类型是void *。

/*
转载文章
原文地址:https://www.cnblogs.com/yujianfei/p/8973872.html

*/

### 使用 `malloc` 函数动态分配二维数组 在C语言中,当需要创建具有可变尺寸或多维的数据结构时,可以使用 `malloc()` 来动态分配内存。对于二维数组而言,可以通过一次调用 `malloc()` 获取一块连续的空间来存储整个矩阵。 #### 方法一:按行优先顺序分配单块内存区域 这种方法涉及计算所需总字节数并一次性请求该数量的内存量。下面是一个具体实例: ```c #include <stdio.h> #include <stdlib.h> #define ROWS 3 /* 定义行数 */ #define COLS 4 /* 定义列数 */ int main(void){ int (*array)[COLS]; // 声明指向含有固定数目元素的一维数组类型的指针 array = (int(*)[COLS])malloc(ROWS * sizeof(*array)); // 分配足够的空间容纳指定行列数目的整型值[^2] if (!array) { fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } // 初始化和打印测试数据... for(size_t row=0 ;row<ROWS;++row){ for(size_t col=0;col<COLS;++col){ array[row][col]=(rand()%9)+1; printf("%d ",array[row][col]); } putchar('\n'); } free(array); // 记得释放不再使用的资源 } ``` 此方法简单高效,在访问元素时也较为直观,因为可以直接采用标准下标操作符 `[i][j]` 进行索引定位。 #### 关键点说明 - **声明方式**:这里定义了一个名为 `array` 的变量作为指向长度为 `COLS` 整形数组的指针。 - **分配语句解释**:`(int(*)[COLS])malloc(...)` 中 `(int(*)[COLS])` 是强制转换部分,告诉编译器新获得的记忆体应该被视作什么类型;而后面的参数则是实际所需的字节总数。 - **错误处理**:始终要检查 `malloc()` 返回的结果是否为空指针,这表明未能成功获取到所求大小的区块。 - **清理工作**:一旦完成对这块动态分配区间的读写活动之后,务必记得调用 `free()` 将其交还给操作系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值