C语言笔记之指针(二)

本文详细解释了指针与内存的关系,包括不同位数电脑中指针的内存占用,malloc()与内存分配,以及sizeof()函数在计算内存大小时的注意点。通过示例代码展示了内存空间大小不会随数据值增大而变化,以及动态分配对指针内存空间的影响。
摘要由CSDN通过智能技术生成

前言

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


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

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

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

内存分配与指针关系

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

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

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

内存大小计算注意事项

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

int size=sizeof(a);

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

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

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


相关代码

#include <stdio.h>
#include <stdlib.h>

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kk_阿白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值