malloc 内存申请案例
#include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { /* void * malloc(size_t size) size_t ==> unsigned long无符号长整型,仅支持正数使用 malloc 函数接受一个参数 size,表示需要分配的字节数 分配成功返回一个指向分配内存的指针;如果分配失败,返回 NULL。 void * 万能指针,可以指向任何一个空间首地址,但是系统要求,不可以通过 void * 访问读取目标空间中数据内容。在使用时需要进行【强制类型转换】, 明确告知当前指针对应数据空间,按照哪一个类型进行处理。 */ //当前操作只是向 CPU 申请内存堆区空间,要求空间字节数为 40 个字节 void *p = malloc(40); // 强制类型转换,告知 CPU当前 p 对应的地址按照 int 类型数据处理方式 int *p1 = (int *)p; /* 通过 p1 操作申请的空间,CPU 通过 p1 操作的对应空间每一个元素都是 int 类型 */ for (int i = 0; i < 40 / sizeof(int); i++) { //1.指针方式操作 //*(p1 + i) = i * 2; //2.数组方式操作 p1[i] = i * 2; } for (int i = 0; i < 40 / sizeof(int); i++) { // 方式一: 可以按照指针形式进行操作 // printf("*(p2 + %d) = %d\n", i, *(p2 + i)); // 方式二: 可以按照数组形式进行操作,当前指针形式,数组的存储数据类型为 int 类型 printf("p1[%d] = %d\n", i, p1[i]); } printf("p = %p\n", p); printf("p1 = %p\n", p1); /* void free(void* ptr); free 函数是用于释放 malloc realloc calloc 申请的内存空间,需要提供给当前 函数申请空间的【首地址】,所需参数是 void * 类型,在实际使用中,可以提供任意类型 指针。 free 操作将 p2 指向内存空间进行释放操作,告知系统当前内存使用完毕,可以其他程序 申请。 */ free (p); /* p 和 p2 原本都存储申请空间首地址,但是对应空间已经通过 free 释放 归还给系统,为了安全操作不可以通过 p 和 p2 访问原本的数据空间,重新 赋值为 NULL,防止后期使用。 */ p = NULL; p1 = NULL; return 0; }
calloc内存申请案例
#include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { /* calloc 案例 void *calloc (size_t_num, size_t_size); 通过 calloc 函数申请内存【堆区空间】, 要求申请的每一个元素 占用内存 4 个字节,总计内存 40 个字节 同时将当前申请的内存空间首地址,强转为 int 类型, CPU 通过 p 操作对应内存空间,每一个元素都是 int 类型 */ int *p = (int *)calloc(10, sizeof(int)); for (int i = 0; i < 10; i++) { p[i] = i + 1; } for (int i = 0; i < 10; i++) { printf("p[%d] = %d\n",i , p[i]); } //释放空间 free(p); //擦除数据 p = NULL; return 0; }
reaclloc 内存申请案例
#include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { // malloc 申请 40 个字节空间数据 int *p = (int *)malloc(10 * sizeof(int)); printf("p = %p\n", p); for (int i = 0; i < 10; i++) { *(p + i) = i * 2; } for (int i = 0; i < 10; i++) { printf("*(p + %d) = %d\n", i, *(p + i)); } /* void * realloc (void *ptr, size_t_size); ptr 是需要提供给当前函数通过 malloc calloc realloc 申请 的内存空间的首地址, size 是当前重新分配空间对应的空间字节数 返回值是新空间首地址 1.地址不变 2.地址改变 【必须使用原本存储空间的首地址的指针变量,接受 realloc 返回值】 */ p = (int *)realloc(p, 60); printf("p = %p\n", p); for (int i = 0; i < 15; i++) { printf("*(p + %d) = %d\n", i, *(p + i)); } free(p); p = NULL; return 0; }
C++内存申请案例
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { //C语言 calloc 申请内存空间 int *arr = (int *)calloc(10, sizeof(int)); //释放函数 free(arr); arr = NULL; //C++ 内存申请空间, 数据类型 变量名 = new 数据类型 int *new_arr = new int[10]; //进行擦除操作,避免野值问题 memset(new_arr,0,sizeof(int)); for (int i = 0; i < 10; i++) { new_arr[i] = i*2; } for (int i = 0; i < 10; i++) { cout << "new_arr[" << i << "]" << new_arr[i] << endl; } delete new_arr; return 0; }
今天的分享到此结束啦!! 我们下期再见!!
本文详细介绍了C++中的内存申请方法,包括malloc、calloc、realloc和new关键字的使用示例,以及内存释放的注意事项。
8892

被折叠的 条评论
为什么被折叠?



