malloc()函数

从大一开始学习C语言已经5年多了,偶尔的时候也会编写一些小的程序,以前总是感觉自己的编程水平还凑活。上次参加一次编程比赛过程中,感觉很多东西很熟悉但是真正要写下来的话还是很麻烦,开始意识到自己的基础不牢。所以有空的时候也会编写一些程序、做一些acm编程联系练练手,巩固一下基础知识。

这部分内容主要来自于百度百科和网络上的相关知识

malloc()函数很早就学过了,但是现在基本上都忘了,现在复习一下这个函数。在学习驱动的过程中牵涉到到很多内核中的东西,有了这些知识理解以前的东西应该很容易。

      malloc() 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针

头文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 与 malloc.h 的内容是完全一致的),而在Visual C++6.0中可以用malloc.h或者stdlib.h

功能:分配长度为num_bytes字节的内存

返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象

函数声明

void *malloc(size_t size);

从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的 指针,并且可以自动计算所需要大小。比如:
1
2
3
int *p;
p = new int ;
//返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:
1
2
3
int * parr;
parr = new int [100];
//返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的 指针
1
2
3
4
5
6
7
int * p;
p = ( int *) malloc ( sizeof ( int )*128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=( double *) malloc ( sizeof ( double )*12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中
第一、malloc 函数返回的是 void * 类型。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型 变量”。所以必须通过 (int *) 来将 强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成 强制转换的习惯。
第二、函数的 实参为 sizeof(int) ,用于指明一个 整型数据需要的大小。如果你写成:
1
int * p = ( int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容被改写。
比如想分配100个int类型的空间:
1
2
int * p = ( int *) malloc ( sizeof ( int ) * 100 );
//分配可以放得下100个整数的内存空间。
另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。


### C语言 `malloc` 函数的使用方法与示例 在C语言中,`malloc` 是一种动态内存分配函数,用于在程序运行时分配指定大小的内存块。以下是关于 `malloc` 的详细说明和使用示例。 #### 1. 函数原型 `malloc` 的函数原型如下: ```c void* malloc(size_t size); ``` 该函数接受一个参数 `size`,表示需要分配的内存量(以字节为单位),并返回指向分配内存的指针。如果分配失败,则返回 `NULL`[^1]。 #### 2. 使用步骤 - **申请内存**:调用 `malloc` 函数,传入所需内存大小。 - **类型转换**:由于 `malloc` 返回的是 `void*` 类型,通常需要将其转换为目标数据类型的指针。 - **检查返回值**:在使用分配的内存之前,务必检查返回值是否为 `NULL`,以确保内存分配成功。 - **释放内存**:当不再需要动态分配的内存时,使用 `free` 函数释放它,避免内存泄漏。 #### 3. 示例代码 以下是一个完整的 `malloc` 使用示例,展示了如何动态分配整数数组的内存: ```c #include <stdio.h> #include <stdlib.h> int main() { int n; printf("请输入数组的大小: "); scanf("%d", &n); // 动态分配内存 int *arr = (int*)malloc(n * sizeof(int)); if (arr == NULL) { // 检查内存分配是否成功 printf("内存分配失败\n"); return 1; } // 初始化数组 for (int i = 0; i < n; i++) { arr[i] = i + 1; } // 输出数组内容 printf("数组内容: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放内存 free(arr); return 0; } ``` #### 4. 注意事项 - **返回值检查**:在调用 `malloc` 后,必须检查返回值是否为 `NULL`,否则可能导致程序崩溃[^5]。 - **内存释放**:动态分配的内存需要手动释放,否则会导致内存泄漏。 - **类型匹配**:强制类型转换应与实际存储的数据类型一致,例如 `(int*)malloc(sizeof(int) * n)`[^2]。 - **未定义行为**:如果传递给 `malloc` 的大小为 0,其行为是未定义的,可能因编译器不同而异[^5]。 #### 5. 常见应用场景 - 动态数组的创建:当数组大小在编译时无法确定时,可以使用 `malloc` 动态分配内存。 - 数据结构实现:如链表、树等复杂数据结构中,节点的内存通常通过 `malloc` 分配。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值