为什么要使用动态内存?
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; 
}

posted on 2022-10-14 20:26  wshidaboss  阅读(173)  评论(0编辑  收藏  举报