• C++程序的内存分区


    1. 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等。
    2. 堆区(heap):一般由程序员分配释放,随叫随到,挥之即走。
    3. 全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
    4. 文字常量区:存放常量字符串。
    5. 程序代码区:存放函数体(包括类的成员函数、全局函数)的二进制代码

    以下是代码演示:

    1. #include
    2. #include
    3. #include
    4. int laoyezi = 58;
    5. //1.栈的内存
    6. void say_hello(const char * msg){ //函数的参数和局部变量存放在栈区
    7. //int x,y,z;
    8. if(msg){
    9. printf("Hello, %s!", msg);
    10. }else {
    11. printf("Hello, who are u?\n");
    12. }
    13. printf("老爷子今年 %d 岁!\n", laoyezi);
    14. //printf("小姐今年 %d 岁!\n", girl);
    15. }
    16. void gui_fang(int jiaren){
    17. static int girl = 17;
    18. if(girl==17) {
    19. girl = 18;
    20. }else {
    21. girl = 16;
    22. }
    23. printf("小姐今年 %d 岁!\n", girl);
    24. }
    25. int main(void) {
    26. int num = 0;
    27. int *salary = NULL;
    28. //4.字符串常量
    29. char *p = "童养媳";
    30. char *p1 = "童养媳";
    31. printf("p: 0x%p p1: 0x%p\n", p, p1);
    32. system("pause");
    33. exit(0);
    34. //3 .全局变量/静态变量
    35. printf("老爷子今年 %d 岁!\n", laoyezi);
    36. gui_fang(0);
    37. gui_fang(0);
    38. //salary = new int(666);
    39. //2. 堆,动态没存分配
    40. salary = new int; //在堆区分配动态内存
    41. *salary = 100;
    42. printf("salary: %d\n", *salary);
    43. delete salary;
    44. system("pause");
    45. exit(0);
    46. //say_hello("骚年们!");
    47. printf("请输入需要雇佣的农民数量:\n");
    48. scanf_s("%d", &num);
    49. if(num<=0){
    50. //提示用户重新输入
    51. }
    52. salary = new int[num];
    53. for(int i=0; i
    54. *(salary+i)= i+1;
    55. }
    56. for(int i=0; i
    57. printf("第%d 个农民的薪资: %d\n", i+1, salary[i]);
    58. }
    59. printf("---over---\n");
    60. delete[] salary;
    61. //切记,delete 后的动态内存,禁止访问
    62. /*for(int i=0; i
    63. printf("第%d 个农民的薪资: %d\n", i+1, salary[i]);
    64. }*/
    65. system("pause");
    66. return 0;
    67. }

    为什么要使用动态内存

    1.按需分配,根据需要分配内存,不浪费

    1. // demo9-2.c
    2. #include
    3. #include
    4. #include
    5. int main(void)
    6. {
    7. int farmer[10] = { 20, 22, 25, 19, 18, 23 ,17, 28, 30, 35 };
    8. int num = 0;
    9. int* salary = NULL;
    10. printf("请输入需要雇佣的农民数量:\n");
    11. scanf_s("%d", &num);
    12. if (num <= 10) {
    13. //提示用户重新输入
    14. }
    15. //后面新增的都是 18
    16. salary = new int[num];
    17. //第一种,逐个赋值
    18. /*for(int i=0; i
    19. {
    20. *(salary+i)= farmer[i];
    21. }*/
    22. //第二种,内存拷贝
    23. memcpy(salary, farmer, sizeof(farmer));
    24. for (int i = sizeof(farmer) / sizeof(int); i < num; i++)
    25. {
    26. //salary[i] = 18;
    27. *(salary + i) = 18;
    28. }
    29. for (int i = 0; i < num; i++)
    30. {
    31. printf("第%d 个农民的薪资: %d\n", i + 1, salary[i]);
    32. }
    33. delete[] salary;
    34. system("pause");
    35. return 0;
    36. }

    内存拷贝函数

    void *memcpy(void *dest, const void *src, size_t n);

    #include

    功能:从源 src 所指的内存地址的起始位置开始拷贝 n 个字节到目标 dest 所指的 内存地址的起始位置中

    new 分配内存布局图

     

    2.被调用函数之外需要使用被调用函数内部的指针对应的地址空间

    1. // demo9-3.c
    2. #include
    3. #include
    4. #include
    5. //通过返回动态内存的指针
    6. int* demo(int count)
    7. {
    8. int* ap = NULL;
    9. //new delete C++ 的动态内存分配操作符 c 语言是 malloc
    10. ap = (int*)malloc(sizeof(int) * count);//参数:所需内存的字节数
    11. //ap = new int[count];
    12. for (int i = 0; i < count; i++)
    13. {
    14. ap[i] = 100 + i;
    15. }
    16. for (int i = 0; i < count; i++)
    17. {
    18. printf("*(ap+%d) = %d\n", i, *(ap + i));
    19. }
    20. return ap;
    21. }
    22. //通过二级指针来保存
    23. void demo1(int count, int** pointer_p)
    24. {
    25. int* ap = NULL;
    26. *pointer_p = (int*)malloc(sizeof(int) * count);
    27. ap = *pointer_p;
    28. for (int i = 0; i < count; i++)
    29. {
    30. ap[i] = 100 + i;
    31. }
    32. for (int i = 0; i < count; i++)
    33. {
    34. printf("*(ap+%d) = %d\n", i, *(ap + i));
    35. }
    36. }
    37. int main(void)
    38. {
    39. //两种方式获取被调用函数内部的内存
    40. int* pointer = NULL;
    41. int count = 10;
    42. //第一种,通过返回动态内存的指针
    43. //pointer = demo(count);
    44. //
    45. //第二种,通过二级指针来保存
    46. demo1(count, &pointer);
    47. for (int i = 0; i < 10; i++)
    48. {
    49. printf("*(pointer+%d) = %d\n", i, *(pointer + i));
    50. }
    51. //用完了,要记得释放
    52. free(pointer); //c 语言中的释放内存函数,相当于 delete
    53. system("pause");
    54. return 0;
    55. }

    C 内存分配:

    void *malloc(size_t size); void free(void *); malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域 的首地址.

    3.突破栈区的限制,可以给程序分配更多的内存

    1. // demo 9-4.c
    2. #include
    3. #include
    4. #include
    5. //栈区的空间大小是有限制的,windows 上一般是 1M - 2M
    6. void demo()
    7. {
    8. //int a1[102400*2]; //100k*2*4 = 800K
    9. //int a1[102400*3]; //100k*3*4 = 1200K = 1.2M
    10. int* a1;
    11. //如果使用堆的话,64 位 windows 10 系统的限制是 2G
    12. a1 = (int*)malloc((int)(1024 * 1000 * 1000));//分配 2G
    13. a1[0] = 0;
    14. printf("This is a demo.\n");
    15. }
    16. int main(void)
    17. {
    18. printf("--start--\n");
    19. demo();
    20. printf("--end--\n");
    21. system("pause");
    22. return 0;
    23. }
  • 相关阅读:
    【剑指offer系列】37. 序列化二叉树
    家政预约小程序07服务分类展示
    Java爬虫实战系列——常用的Java网络爬虫库
    会声会影2023官方破解版激活码
    9.Redis-zset
    信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)
    react中react-custom-scrollbars返回顶部功能,如何使其有平滑动画效果;原生js scroll平滑动画效果
    X-Model传播模型3D仿真 在5G室内外协同规划中应用与研究
    国标GB28181协议视频平台EasyGBS国标平台设备播放断流现象的排查分析及解决
    UE4两种点击空间UI弹窗的方式
  • 原文地址:https://blog.csdn.net/m0_65635427/article/details/127785398