• C语言笔记之指针(二)


    前言

    本文主要介绍指针与内存和地址的关系,指针与内存关系深入解析,包括占用大小、动态分配,提醒使用sizeof()注意点。仅供大家参考学习,若有错换之处,欢迎交流指导~


    指针在不同位数电脑中的内存占用

    在上图左边可以看出,不同位数的电脑中,指针本身所占的内存空间大小也不同.

    • 32位的电脑中,单个变量共有2^32种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^32,也就是需要4个字节的内存空间大小.
    • 64位的电脑中,单个变量共有2^64种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^64,也就是需要8个字节的内存空间大小.

    内存分配与指针关系

    假如我们使用malloc()函数申请内存空间

    int *a=malloc(sizeof(int)*6);
    
    • 1

    那么指针所存储的地址为申请的内存空间的首个地址,也就是a&a[0]相等,正如图中右边所示.因为a是指针所指向的地址,而&a[0]是指向地址的首地址,故两者相等.

    内存大小计算注意事项

    假如我们使用sizeof()去计算内存空间大小

    int size=sizeof(a);
    
    • 1

    实际计算的是指针a的所占内存空间大小,而不是a[0]a[5]的内存空间大小.正如下面的代码中的指针,无论你用malloc()分配多大的内存,两者用sizeof()计算的大小都是一致的.

    int *a=malloc(sizeof(int)*1);
    int *b=malloc(sizeof(int)*2);
    
    • 1
    • 2

    因为当你使用free()释放内存空间时,指针本身的内存空间还是会存在的,所以在释放后用sizeof()去测量内存时,其值仍问指针本身的内存空间,也就是图中的左边部分.


    相关代码

    #include 
    #include 
    
    int main(void)
    {
        /** number0,number2进行赋值操作,number1,number3不赋值 **/
        int number0[3];
        int number1[3];
        int *number2 = malloc(sizeof(int) * 3);
        int *number3 = malloc(sizeof(int) * 3);
    
        /** 未赋值前指针所占空间大小 **/
        printf("number2内存空间为%d,\nnumber3内存空间为%d\n\n", sizeof(number2), sizeof(number3));
    
        /** 赋值操作 **/
        for (int i = 0; i < 3; i++)
        {
            number0[i] = i;
            number2[i] = i;
        }
    
        printf("number0所占内存大小为%d,\nnumber1所占内存大小为%d,\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number0), sizeof(number1), sizeof(number2), sizeof(number3));
        /**  内存空间大小不随存储数据值的大小而变化 **/
        for (int i = 0; i < 3; i++)
        {
            number0[i] = 1 << 31 - 1;
            number2[i] = 1 << 31 - 1;
        }
        printf("number0所占内存大小为%d,\nnumber2所占内存大小为%d\n\n", sizeof(number0), sizeof(number2));
        /** 检测number2数组元素是否溢出 **/
        for (int i = 0; i < 3; i++)
        {
            printf("number2[%d]=%d\n", i, number2[i]);
        }
        free(number2);
        free(number3);
        number2 = NULL;
        number3 = NULL;
        /** 检测是否释放完指针
         *  问题:运行后发现并没有释放完指针
         *  分析:这是因为free()函数取消给该指针存储的内存空间,但是指针本身的内存空间并没有取消,
         *  所以sizeof()函数依然可以检测到指针的内存空间大小
         */
        printf("\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));
    
        /** 改变动态分配的内存
         * 结论:动态分配不改变指针本身的内存空间大小,但是可以改变指针指向的内存空间大小
         * sizeof()函数检测的是指针本身的内存空间大小,
         * 无论是改变指针指向的地址还是改变指针指向的内存空间大小,
         * 都不会改变指针本身的内存空间大小
         **/
        number2 = malloc(sizeof(int));
        number3 = malloc(sizeof(int) * 2);
    
        printf("number2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

  • 相关阅读:
    RichView TRVDocParameters 页面参数设置
    c++字符特性模板char_traits,到底是什么?
    平面设计师要会3D吗 优漫动游
    【MySQL】根据查询结果更新统计值
    java项目容器化(docker)部署注意点
    Linux主机连接腾讯云服务器
    Minecraft 1.12.2模组开发(五十五) 动画生物实体
    如何在SpringBoot中定义一个自定义的Starter?
    配置nginx反向代理,监控https流量
    ElasticSearch详解
  • 原文地址:https://blog.csdn.net/qq_61637982/article/details/133924125