c语言动态内存分配知识点及实例

所属分类: 软件编程 / C 语言 阅读数: 123
收藏 0 赞 0 分享

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

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

int arr[5] ;

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

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

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

例:

double *p;

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

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

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

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

int arr[n];

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

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

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

例:

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

free(p);

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

程序例子:

#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++更容易。

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

知识点补充:

常见的动态内存错误

常见的错误有:对NULL指针进行解引用操作、对分配的内存进行操作时越过边界、释放并非内存分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存释放之后被继续使用。

更多精彩内容其他人还在看

从汇编看c++中变量类型的深入分析

本篇文章是对c++中的变量类型进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

从汇编看c++的默认析构函数的使用详解

本篇文章是对c++中默认析构函数的使用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

基于c++中的默认拷贝函数的使用详解

本篇文章对c++中默认拷贝函数的使用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

解析c++中的默认operator=操作的详解

本篇文章是对c++中的默认operator=操作的应用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

解析c++中参数对象与局部对象的析构顺序的详解

本篇文章是对c++中参数对象与局部对象的析构顺序进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入c++中临时对象的析构时机的详解

本篇文章对c++中临时对象的析构时机进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

解析内存对齐 Data alignment: Straighten up and fly right的详解

对于所有直接操作内存的程序员来说,数据对齐都是很重要的问题.数据对齐对你的程序的表现甚至能否正常运行都会产生影响
收藏 0 赞 0 分享

深入内存对齐的详解

本篇文章是对内存对齐进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入C语言把文件读入字符串以及将字符串写入文件的解决方法

本篇文章是对C语言把文件读入字符串以及将字符串写入文件的方法进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入Windows下的回车是回车换行(\r\n)还是换行回车(\n\r)的详解

本篇文章对Windows下的回车是回车换行(\r\n)还是换行回车(\n\r)进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享
查看更多