首页 > 系统相关 >【C语言菜鸟知识】——动态内存管理

【C语言菜鸟知识】——动态内存管理

时间:2023-09-25 10:57:21浏览次数:47  
标签:malloc 字节数 菜鸟 C语言 内存 动态内存 储存区 开辟

---------------------------------------------------------------------------------------------------------------------

 

1、栈
在全局变量是分配在内存中的静态储存区,非静态的局部变量是分配在内存中的动态储存区,这个储存区就是栈的区域。
2、堆
在内存中允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必声明部分定义,也不必等到函数结束时才释放,需要时可以随时开辟,不需要时随时释放。这些数据临时存放在一个特别的自由储存区,就是堆区。只能通过指针来引用。

 

 

现在我们已学了两种开辟空间的方式,其一:int a = 0;这种一次开辟一小块空间,其二:int arr[10] = { 0 };这种一次开辟一大块空间。但这两种开辟方式是有局限性的,一旦开辟就无法再更改开辟空间的大小了。


举个例子:现创建了一个结构体数组,数组每个元素都是一个人的信息,而该数组能存放100个人的信息。但我仅需要存放3个人的信息,对于这个结构体数组来说,剩余的97个空间不就浪费了嘛;同理我需要存放120个人的信息,对于该数组来说是放不下的,而我又不能对其大小进行修改。

 

这两种开辟空间的方式是在栈区上开辟;栈区中申请的空间是固定死的无法修改。而动态内存是在堆区开辟空间。

 

对于内存的动态分配管理,包括动态内存函数:malloc、calloc、realloc、free。要使用这几个函数就必须先引用一个头文件<stdlib.h>才行。

 

3、malloc
在C语言中提供了动态内存分配的函数:

void* malloc(size_t size)

 

通过malloc函数,可以在堆区申请一块连续可用的空间供我们使用。
size ——表示我们要开辟多大的一块内存空间(单位是字节)。
该函数返回一个指针,指向已分配大小的内存。如果请求失败,则返回 NULL。

注意:
malloc内的参数是需要动态分配的字节数,而不是可以存储的元素个数!

 

当动态分配内存时,存储的是字符型数据,每个元素1字节,所以字节数刚好等于需要存储的元素个数(字符数+1);
如果存储的是整型或浮点型数据,字节数等于“需要存储的元素个数 * 一个元素的字节数”,
代码格式为:

type *var_name = (type*)malloc(sizeof(type)*num);

 

 

 

标签:malloc,字节数,菜鸟,C语言,内存,动态内存,储存区,开辟
From: https://www.cnblogs.com/ZYL-FS/p/17727399.html

相关文章

  • C语言动态内存分配
      #include<iostream>#include<stdio.h>int*removeDuplicates(intnumsSize){//malloc是常用的动态内存分配int*arr=(int*)malloc(numsSize*sizeof(int));returnarr;}intmain(){intnumsSize=10;int*arr;a......
  • C语言学习记录---函数4
    汉诺塔问题(递归)#include<stdio.h>//定义汉诺塔函数voidhanoi(intn,charA,charB,charC){if(n==1){printf("将盘子从%c移动到%c\n",A,C);}else{//将n-1个盘子从A移动到Bhanoi(n-1,A,C,B);//将第n个盘子从......
  • C语言标准库
    https://www.gnu.org/software/libc/manual/pdf/libc.pdfhttps://cplusplus.com/reference/clibrary/NOTICE不能在头文件中定义全局变量,否则该变量会存在于任何#include<ThisHeader_H>的地方。要学会防御式编程,即要保证头文件的幂等性#ifndef_STDIO_H #define_STDIO......
  • C语言学习记录---函数3
    声明#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>#include<time.h>#include<math.h>7.3递归与迭代7.3.1练习3:求n的阶乘。(不考虑溢出)参考代码:intFacl(intn){if(n>1){returnn=n*Facl......
  • C语言char类型的存储
    (目录)char是如何存储的字符型(char)用于储存字符(character),如英文字母或标点。但是char类型在内存中并不是以字符的形式储存,而是以ASII码的形式储存,也可以说char类型储存的实际上是整数。所以char类型也被归类为整形家族。intmain(){ charc='A'; printf("%d\n",c); print......
  • C语言-字符串相关库函数用法+模拟实现
    常见的与字符串有关的库函数strstr()寻找子字符串strcat()字符串追加函数strcmp()字符串比较函数strcpy()字符串拷贝函数strlen()求解字符串长度...1.strstr()寻找子字符串我们先来看MSDN中对该函数的功能描述:Findasubstring.(寻找子......
  • C语言-字符串相关库函数用法+模拟实现
    常见的与字符串有关的库函数strstr()寻找子字符串strcat()字符串追加函数strcmp()字符串比较函数strcpy()字符串拷贝函数strlen()求解字符串长度...1.strstr()寻找子字符串我们先来看MSDN中对该函数的功能描述:Findasubstring.(寻找子......
  • C语言实现身份运行游戏
    C语言实现:需要一款软件,程序,EXE等都可以假设我自己的程序名为游戏.exe需要的程序为XX.exe已有条件:来宾用户已启用,用户名,密码都有,现成的以其他用户身份运行的bat文件也有,双击bat文件,即可以其他用户身份运行游戏.exe需求:首先打开XX.exe该程序直接后台运行,不需要界面或任何提示,......
  • 【C语言版】扫雷游戏
     思路设置两个数组初始化两个数组打印数组设置雷排查雷game.h#pragmaonce#defineROW9//定义行为9#defineCOL9//定义列为9#defineROWSROW+2//排查雷时防止溢出#defineCOLSCOL+2#defineEASY_COUNT10//初步设有10个雷voidInitBoard(charboard[ROWS][COLS],i......
  • 【C语言版】扫雷游戏
     思路设置两个数组初始化两个数组打印数组设置雷排查雷game.h#pragmaonce#defineROW9//定义行为9#defineCOL9//定义列为9#defineROWSROW+2//排查雷时防止溢出#defineCOLSCOL+2#defineEASY_COUNT10//初步设有10个雷voidInitBoard(charboard[ROWS][COLS],in......