动态内存函数使用代码

2023-10-11 20:59:12 浏览数 (1)

malloc

void *malloc(size_t size)

size -- 内存块的大小,以字节为单位。 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 如果我们需要解引用指针,那么就必须指定它的类型,之前我们讨论过这个问题。直接强转转换需要的类型就可以。

代码语言:javascript复制
#include<stdio.h>
#include<Windows.h>
int main()
{
  char*p = (char*)malloc(10 * sizeof(char));
  p = "cvpotato";
  printf("p = %d %s", p, p);
}

calloc

 void *calloc(size_t nitems, size_t size)

nitems -- 要被分配的元素个数。

size -- 元素的大小。 calloc和malloc的区别是calloc会初始化从堆分配内存为0 而malloc不会初始化为0

代码语言:javascript复制
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
  int main()
  {
      int i, n;
      int* a;

      printf("要输入的元素个数:");
      scanf("%d", &n);

      a = (int*)calloc(n, sizeof(int));
      printf("输入 %d 个数字:n", n);
      for (i = 0; i < n; i  )
      {
          scanf("%d", &a[i]);
      }

      printf("输入的数字为:");
      for (i = 0; i < n; i  ) {
          printf("%d ", a[i]);
      }
      free(a);  // 释放内存
      return(0);
  }

realloc

如果你想修改已经申请的内存块的大小 void *realloc(void *ptr, size_t size)

ptr -- 要重新分配内存的内存块。如果为NULL则表示重新申请一块内存 与malloc功能一样

size--内存块新的大小,以字节为单位。如果为0,则功能和free一样,释放ptr指向的内存块,并且返回一个空指针

代码语言:javascript复制
#include<stdio.h>
#include<Windows.h>
#pragma warning (disable:4996)
int main()
{
  int n = 0;
  printf("请输入数组的大小n");
  scanf("%d", &n);
  int* p = (int*)calloc(n ,sizeof(int));
  for (size_t i = 0; i < n; i  )
  {
      p[i]  = i;
  }
  int*B = (int*)realloc(p, 2*n*sizeof(int));
  printf("p = %d B = %dn", p, B);
  for (size_t i = 0; i < 2*n; i  )
  {
      printf("%dn", B[i]);
  }
  free(p);    
}

可以看到p的地址和B的地址一样 由此可以推断B内存在p内存上进行了扩展 如果没有连续内存的话 B会创建一块内存区域 然后把A的内容拷贝过来 (新申请内存大于之前的内存) 如果新申请的内存小于之前申请的内存,realloc会把多出来的内存区域释放掉,realloc(p,0);相当于free(p);

0 人点赞