流心
发布于 2024-05-11 / 0 阅读
0

动态内存分配

输入数据

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int number;
    int *a;
    printf("输入数量:");
    scanf_s("%d",number);
    // int a[number] //C99写法

    // C99之前写法
    // malloc的参数不是要多少个 int 不是数组要多少单元,而是这个数组占据多少空间以字节为单位
    // 前面的(int*) 是类型转换
    a = malloc(number*sizeof(int));
    return 0;
}
  • 如果输入数据时,先定义个数,然后再输入,记录每个数据

  • C99可以用变量做数组定义大小,C99之前只能

    • int a = (int ) malloc(n*sizeof(int));

    • 使用 malloc 给出一块内存空间

malloc

#include<stdlib.h>

void* malloc(size_t size);

  • 向 malloc 申请的空间大小是以字节为单位的

  • 返回的结果是 void* 需要类型转换为自己需要的类型

  • 需要的空间数量 * sizeof

  • (int*)malloc(n*sizeof(int))

  • 没空间

    • 如果申请失败返回0,或者 NULL

    • 系统能给多大空间

  • 申请空间的代码

    • 申请100兆空间:1024 是 1k 1024*1024是一兆 再*100就是100兆

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  void* p;
  int cnt = 0;
  while(p = malloc(100 * 1024 * 1024){
    cnt ++;
  }
  printf("分配了%d00mb空间\n",cnt);
  return 0;  
}

free()

  • 申请来的空间都要还给系统

  • 只能还申请来的空间的首地址

  • 跟 malloc 是配套使用的

常见问题

  • 申请空间没 free() 长时间运行内存下降

  • free() 过了再次 free()

  • 地址变了,再一次 free()