时间:2022-06-07 09:22:34 | 栏目:C代码 | 点击:次
1.按需分配,根据需要分配内存,不浪费
int main(void) { int money[10] = { 1, 2, 3 ,4, 5, 6, 7, 8, 9, 10 }; //工钱 int len = sizeof(money) / sizeof(money[0]); //money数组的长度 int num = 20; //人数 int *salary = 0; //薪资 //给salary指针分配num个内存 salary = new int[num]; //方式一, 逐个赋值 /*for (int i = 0; i < len; i++) { *(salary + i) = money[i]; }*/ //方式二, 使用memcpy内存拷贝 //memcpy(目标, 源数组, 数组的字节); memcpy(salary, money, sizeof(money)); for (int i = len; i < num; i++) { *(salary + i) = 666; //后面的元素全部赋值为666 } for (int i = 0; i < num; i++) { cout << "第" << i+1 << "个员工的薪资是: " << *(salary + i) << endl; } system("pause"); return 0; }
2.被调用函数之外需要使用被调用函数内部的指针对应的地址空间
#include <iostream> #include <Windows.h> #include <string.h> using namespace std; //方式一, 返回分配给指针的地址 int* copy1(int count) { int* ap = NULL; //malloc是C语言中的动态内存分配操作符 ap = (int*)malloc(sizeof(int) * count); //new是C++中的动态内存分配操作符 //ap = new int[count]; if (ap == NULL) { exit(1); } for (int i = 0; i < count; i++) { *(ap + i) = 100 + i; } return ap; //返回指针的地址 } //方式二, 使用二级指针 void copy2(int** ap, int len) { *ap = (int*)malloc(sizeof(int) * len); if (*ap == NULL) { exit(1); } for (int i = 0; i < len; i++) { *(*ap + i) = 100 + 1; } } int main(void) { int* p = NULL; //方式一, 接收copy1函数返回指针的地址 //p = copy1(10); //方式二, 使用二级指针 copy2(&p, 10); for (int i = 0; i < 10; i++) { cout << "第" << i+1 << "个员工的薪资是: " << *(p+ i) << endl; } //c 语言中的释放内存函数,相当于 delete free(p); system("pause"); return 0; }
C 内存分配: void *malloc(size_t size); // 分配内存 void free(void *); // 释放内存 malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域的首地址.
3.突破栈区的限制,可以给程序分配更多的内存
#include <iostream> #include <Windows.h> using namespace std; //栈区的空间大小是有限的, 在Windows系统中一般有 1-2 M的内存 void demo1() { int a1[102400 * 2]; //100k * 2 * 4 = 800k //int a1[102400 * 3]; //100k * 3 * 4 = 1200k a1[0] = 1; cout << "This is a demo!" << endl; } //堆空间的大小是有限的, 在Windows10系统的限制是 2G void demo2() { int* p = NULL; p = (int*)malloc(1024 * 1000 * 1000 * 2); //大约2G p[0] = 1; cout << "This is a stack demo!" << endl; } int main(void) { //栈空间 //demo1(); //堆空间 demo2(); system("pause"); return 0; }