zoukankan      html  css  js  c++  java
  • 第38课

    第38课 - 动态内存分配

    1. 动态内存分配的意义

    (1)C语言中的一切操作都是基于内存的

    (2)变量和数组都是内存的别名

    内存分配由编译器在编译期间决定

    定似数组的时候必须指定数组长度

    数组长度是在编译器就必须确定的

    需求 : 程序运行的过程中,可能需要使用一些额外的内存空间

    2. malloc 和 free

    (1)malloc和free用于执行动态内存分配和释放

    (2)malloc所分配的是一块连续的内存

    (3)malloc以字节为单位并且不带

    3. malloc/calloc/realloc三兄弟

    前面已经介绍了malloc函数,这一节介绍一下calloc函数和realloc函数。

    (1)calloc函数    ==>  在堆上分配一段内存空间,与malloc不同的是,calloc会将分配的内存空间初始化为0

    函数原型: void *calloc(size_t  nmemb,  size_t  size);

    函数参数:在程序的堆空间上分配nmemb个长度为size的连续空间,即分配的内存大小为 nmemb * size。与malloc函数不同的是,calloc会将分配的内存空间初始化为0。

    函数返回值:

    • 成功返回分配的动态内存的起始地址
    • 失败返回NULL
    • 如果 nmemb 或 size 为0,返回NULL或一个指针,只不过这个指针对应的内存长度为0

    malloc的m我知道是memory的意思,calloc的c不知道是什么意思。。。Google搜索了一下 What does the first “c” stand for in “calloc”?

    (2)realloc函数    ==>  重新在堆上分配一块size大小的内存空间,并将ptr指向的内存空间内容拷贝到这块新的内存空间,并释放掉ptr指向的内存空间(在realloc之后就不能再使用ptr指向的内存空间了)

    函数原型:void *realloc(void *ptr,  size_t  size);

    函数参数:ptr为需要重新分配内存空间的指针,它是之前malloc、calloc、realloc函数的返回值;size为新的内存空间的大小

    函数返回值:

    • 成功返回新分配的动态内存空间的起始地址
    • 失败返回 NULL
    • 如果传入的 ptr 为NULL,等价于 malloc(size)
    • 如果传入的ptr不等于NULL且size为0,等价于 free(ptr)

    【calloc和realloc的使用】

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #define SIZE 5
     5 
     6 int main()
     7 {
     8     int *pI = malloc(SIZE * sizeof(int));
     9     short *pS = calloc(SIZE, sizeof(short));
    10 
    11     int i;
    12     for (i=0; i<SIZE; i++) {
    13         /*
    14             在Linux上,malloc的打印也为0,这个只是编译器的特性,不写写依赖编译器的代码,不具有可移植性
    15             在Windows上,malloc的打印就是随机值
    16             calloc的打印在Linux和Windows上都为0
    17         */
    18         printf("pI[%d] = %d, pS[%d] = %hd
    ", i, pI[i], i, pS[i]);
    19     }
    20 
    21     printf("Before: pI = %p
    ", pI);  // Before: pI = 0x23b7010
    22 
    23     pI = realloc(pI, 2 * SIZE * sizeof(int));
    24 
    25     printf("After: pI = %p
    ", pI);   // After: pI = 0x23b7050
    26                                       // 可以看到使用realloc重新申请内存后,pI的值变了
    27 
    28     for (i=0; i < 2*SIZE; i++) {
    29         printf("pI[%d] = %d
    ", i, pI[i]);
    30     }
    31 
    32     return 0;
    33 }
  • 相关阅读:
    c#缓存技术(Dictionary)
    反射Reflection创建
    SQL Server手注之延时型盲注
    MySQL——事务
    MySQL——NULL值处理
    MySQL——连接的使用
    SQL server手注之报错注入
    SQL Serves手注之联合查询注入
    MySQL手注之ROOT权限处理
    MySQL——正则表达式
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/11854019.html
Copyright © 2011-2022 走看看