为什么要使用动态内存?
1.按需分配,根据需要分配内存,不浪费;
2.被调用函数之外需要使用被调用函数内部的指针对应的地址空间;
3.突破栈区的限制,可以给程序分配更多的内存。
(1)C 内存分配:
void *malloc(size_t size);
void free(void *);
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域的首地址。
(2)C++内存分配:
void *memcpy(void *dest, const void *src, size_t n);
#include<string.h>
功能:从源 src 所指的内存地址的起始位置开始拷贝 n 个字节到目标 dest 所指的内存地址的起始位置中。
#include <iostream> #include <string.h> #include <windows.h> using namespace std; int main() { int farmer[10] = { 20,22,36,41,52,36,78,95,82,15 }; int num = 0; int* salary = NULL; printf("请输入需要雇佣的农民数量:\n"); scanf_s("%d",&num); if (num < 10) { cout << "请输入一个大于9的数!" << endl; system("pause"); exit(1); } //后面新增的都是18 salary = new int[num]; //第一种:逐个赋值 //for (int i = 0; i < sizeof(farmer) / sizeof(int); i++) { // *(salary + i) = farmer[i]; //} //第二种,内存拷贝 memcpy(salary, farmer, sizeof(farmer)); for (int i = sizeof(farmer) / sizeof(int); i < num; i++) { //salary[i]=18; *(salary + i) = 18; } for (int i = 0; i < num; i++) { printf("第%d个农民的薪资:%d\n",i+1,salary[i]); } delete[] salary; system("pause"); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> //通过返回动态内存的指针 int * demo(int count){ int *ap = NULL; //new delete C++ 的动态内存分配操作符 c 语言是 malloc ap = (int *)malloc(sizeof(int) * count); //参数:所需内存的字节数 //ap = new int[count]; for(int i=0; i<count; i++){ ap[i] = 100+i; } for(int i=0; i<count; i++){ printf("*(ap+%d) = %d\n", i, *(ap+i)); } return ap; } //通过二级指针来保存 void demo1(int count, int ** pointer_p){ int * ap = NULL; *pointer_p=(int *)malloc(sizeof(int) * count); ap = *pointer_p; for(int i=0; i<count; i++){ ap[i] = 100+i; } for(int i=0; i<count; i++){ printf("*(ap+%d) = %d\n", i, *(ap+i)); } } int main(void){ //两种方式获取被调用函数内部的内存 int * pointer = NULL; int count = 10; //第一种,通过返回动态内存的指针 //pointer = demo(count); //第二种,通过二级指针来保存 demo1(count, &pointer); for(int i=0; i<10; i++){ printf("*(pointer+%d) = %d\n", i, *(pointer+i)); } //用完了,要记得释放 free(pointer); //c 语言中的释放内存函数,相当于 delete system("pause"); return 0; }
#include <stdlib.h> #include<stdio.h> #include<string.h> //栈区的空间大小是有限制的,windows 上一般是 1M - 2M void demo(){ //int a1[102400*2]; //100k*2*4 = 800K //int a1[102400*3]; //100k*3*4 = 1200K = 1.2M int * a1; //如果使用堆的话,64 位 windows 10 系统的限制是 2G a1 = (int *)malloc((int)(1024*1000*1000));//分配 2G a1[0]=0; printf("This is a demo.\n"); } int main(void){ printf("--start--\n"); demo(); printf("--end--\n"); system("pause"); return 0; }