动态内存函数:malloc的使用详解

简介: 动态内存函数:malloc的使用详解

各个动态内存函数的使用条件!


1.动态内存的分配:


对于下列代码,所申请的空间是固定的:


int num=10;       //向内存申请4个字节

int arr[10]={0};  //向内存申请40个字节

但是对于数组arr[10],已经申请40个字节的空间,如果部分没有使用就会造成浪费,或者有可能不够,就得使用更多的空间,所以动态内存分配的存在,显得非常重要!!


对于上述的开辟的空间的方式,有两个特点:


1.空间开辟的大小是固定的!!


2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配!!


但是,对于空间的需求,不仅仅时上述的情况,有时候,我们需要的空间大小,在程序运行的时候才能知道,那数组的编译时 ,开辟空间的方式就不能满足了!!


因此,基于上述种种原因。动态内存开辟显得尤为重要!!


下面进入:malloc动态内存开辟函数的详解!!


使用语法为:


void* malloc (size_t size)

size_t  是指:无符号的整型!!


size: 是指:大小,单位为字节


malloc 这个函数,向内存申请size个字节的空间,然后将申请的空间的起始地址返回!!


但是,上述的返回类型为什么是:void*类型呢??


 原因在于:只申请了size个字节的大小,并没有指明内存中放什么类型的数据!导致不知道用什么类型的指针来维护这个空间合适!!所以,返回的是void* 的指针!!


malloc 函数所需要的头文件为: #include <stdlib.h>


下面请看,使用案列:


#include <stdio.h>
#include <stdlib.h>
int main()
{
  int arr[10] = { 0 };  //向内存申请了10*4=40个字节的空间
  void* p = malloc(40);  //40字节
}

在上面的void* p = malloc(40)中,向内存申请了40个子节的空间!malloc会返回一个地址,将这个地址放到void*的指针里面!!


若将malloc 开辟的40个空间里面放入10个整型!需要强制类型转化;代码书写情况为:


int* p = (int*)malloc9(40);

这个就是需要将malloc开辟的void*类型的指针强制类型转换为:int *类型的指针!!


但是,对于malloc开辟空间失败,则会返回一个空指针(NULL)!一般情况下,开辟空间都会成功,很少有失败的案列(开辟一个很大的空间,可能会失败)


开辟空间的代码使用情况:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main()
{
  //int arr[10]={0};  //向内存申请40个字节的空间
  int* p = (int*)malloc(40);
  int* ptr = p;
  if (ptr == NULL)
  {
  printf("%s\n", strerror(errno));
  return 1;
  }
  //使用
  int i = 0;
  for (i = 0; i < 10; i++)
  {
  *ptr = i;
  ptr++;
  }
  //释放
  free(p);  
  //关于free()的用法,大家先不用知道,在后续会有讲解!!
  p = NULL;
}

上述的代码,仅仅是为了向各位老铁介绍一下如何使用malloc函数!并不做其他作用,所以,在最后,笔者也没有进行用printf函数来打印出来代码!!


1.int* ptr = p;  如果不这样进行,在后面会有进行p++的部分,此时,p已经不再是初始地址,在进行free(p)会报错!!对于free()函数,只需要知道是释放动态开辟空间内存的就可以,其他的在后续博客有更新!!


0a2653c851af460fa595bd959398a8f1.png


对于malloc 是C语言提供的一个动态内存开辟函数!


void* malloc (size_t size)

这个函数向内存申请一块连续可用的空间,并且返回指向这块空间的指针!!


1.如果开辟成功,则返回一个指向这个开辟好空间的起始地址


2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查!!


3.返回值的类型为:void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候,由使用者自己决定!!


4.如果参数size为0,malloc的行为是标准为定义的,取决于编译器!!


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
154 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
22天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
64 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
65 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
366 0