前言
本文主要介绍指针与内存和地址的关系,指针与内存关系深入解析,包括占用大小、动态分配,提醒使用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;
}