c语言怎么实现动态内存分配


本文摘自PHP中文网,作者angryTom,侵删。

c语言怎么实现动态内存分配

我们经常会预先给程序开辟好内存空间,然后进行操作。

1

int arr[5] ;

对这个数组我们在定义的时候必须给提前开辟好空间,并且在程序执行的过程中,这个开辟的内存空间是一直存在的,除非等到这个函数执行完毕,才会将空间释放。有个问题就是这个数组在程序中无法被修改。

这些问题给我们造成了一些使用上的不方便,所以,C中提供了malloc()函数。

关于malloc()函数,这个函数它接受一个参数:就是所需的内存的字节数。然后malloc()找到可用内存中那一个大小适合的块。在这个过程中,malloc()可以来返回那块内存第一个字节的地址。所以,也就意味了我们可以使用指针来操作。malloc()可以用来返回数组指针、结构指针等等,所以我们需要把返回值的类型指派为适当的类型。当malloc()找不到所需的空间时,它将返回空指针。

例:

推荐学习:c语言视频教程

1

2

double *p;

p=(double*)malloc(30*sizeof(double));

在这个程序中,首先开辟了30个double类型的空间,然后把p指向这个空间的位置。在这里的指针是指向第一个double值。并不是我们全部开辟的30个double的空间。这就和数组一样,指向数组的指针式指向数组首元素的地址,并不是整个数组的元素。所以,在这里我们的操作也和数组是一样的,

p[0]就是第一个元素,p[1]就是第二个元素。

至此,我们就可以掌握到一种声明动态数组的方法。

1

2

3

int arr[n];

p=(int *)malloc(n*sizeof(int));

//我们在这里使用的时候要元素个数乘类型字节长度,这样就达到了动态开辟内存空间。

当我们使用malloc()开辟完内存空间以后,我们所要考虑的就是释放内存空间,在这里,C给我们提供了free()函数。free()的参数就是malloc()函数所返回的地址,释放先前malloc()函数所开辟的空间。

例:

对于上面我们所开辟的空间进行释放,那么我们就可以这样

1

free(p);

程序还调用了exit()函数,这个函数是在内存分配失败时结束程序。

程序例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<malloc.h>//malloc()函数被包含在malloc.h里面

#include<stdlib.h>

int main(void)

{

    char*a = NULL;//声明一个指向a的char*类型的指针

    a = (char*)malloc(100 * sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

    if (!a)//如果malloc失败,可以得到一些log

    {

        perror("malloc");

        return-1;

    }

    sprintf(a, "%s", "HelloWorld\n");//"HelloWorld\n"写入a指向的地址

    printf("%s\n", a);//输出用户输入的数据

    free(a);//释放掉使用的内存地址

    system("pause");

    return 0;//例2有无内存泄露?

}

这个程序主要用来检测malloc返回值条件有误。

在这里我们需要注意,在C中,类型指派(char *)是可选的,但是在C++中这个是必须有的,所以使用类型指派将使把C程序移植到C++更容易。

使用动态数组,主要是为了获得程序的灵活性。我们可以需要多少个元素就让数组开辟多少个。不需要浪费空间。

更多编程入门教程,请关注PHP中文网!

以上就是c语言怎么实现动态内存分配的详细内容!

相关阅读 >>

C语言中fun用法详解

C语言位运算符

C语言用什么函数来比较字符串大小?

visual c++6.0怎么新建C语言项目

C语言中什么是逗号运算符并举例

C语言取余符号是什么

C语言程序的基本结构是什么

C语言中预处理命令都必须以什么号开始

C语言中如何用do...while语句求1到100的累加和

C语言怎么定义字符串数组

更多相关阅读请进入《C语言》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...