指针的大小--sizeof问题

本文解析了指针变量的内存占用情况,无论指针指向何种类型,其大小均为4字节,相当于一个int类型。文中还对比了sizeof与strlen函数的区别,并通过多个实例详细解释了它们在不同场景下的应用。
指针的大小是问:一个指针变量占用多少内存空间?

分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。

存放一个地址需要几个字节?答案是和一个 int 类型的大小相同:4字节。

所以,若有:

int* pInt;

char* pChar;

bool* pBool;

float* pFloat;

double* pDouble;

则: sizeof(pInt)、sizeof(pChar)、sizeof(pBool)、sizeof(pFloat)、sizeof(pDouble)的值全部为:4。

PS:你敢拆电脑吗?拆开电脑,认得硬盘数据线吗?仔细数数那扁宽的数据线由几条细线组成?答案:32条,正是 4 * 8。

附:sizeof和strlen的区别
❀第一个例子:
char* ss = "0123456789";
1、sizeof(ss)的结果是4,ss是指向字符串常量的字符指针
2、sizeof(*ss)的结果是1,*ss是第一个字符

❀第二个例子:
char ss[] = "01233456789";
1、sizeof(ss)结果是11,ss是数组,计算到'/0'的位置,因此是10+1
2、sizeof(*ss)结果是1,*ss是第一个字符

❀第三个例子
char ss[100] = "0123456789";
1、sizeof(ss)的结果是100,ss表示在内存中预分配的大小:100*1
2、strlen(ss)的结果是10,它的内部实现是用一个循环计算字符串的长度,直到'/0'为止。

❀第四个例子
int ss[100] = "0123456789";
1、sizeof(ss)的结果是400,ss表示在内存中的大小,为100*4
2、strlen(ss)错误,strlen的参数只能是char*,且必须是以'/0'结尾的。
注:笔者试验时无法对ss初始化
error message:
error C2075: 'ss' : array initialization needs curly braces
这个问题非常经典,涉及到 C 语言中数组和指针的**本质区别**,尤其是 `sizeof(arr)` 和 `sizeof(ptr)` 的区别。 --- ## ❓问题解析: 你问的是: ```c memset(arr, -1, sizeof(arr)); ``` 其中 `sizeof(arr)` 是不是对指针 `arr` 的尺寸计算? --- ## ✅ 答案: > **不是**。`sizeof(arr)` 的含义取决于 `arr` 是**数组名**还是**指针变量**。 ### ✅ 情况一:当 `arr` 是**数组名**时: ```c int arr[10]; memset(arr, -1, sizeof(arr)); // 正确:sizeof(arr) = 10 * sizeof(int) ``` - `sizeof(arr)` 返回的是整个数组占用的字节数。 - 例如:在 32 位系统中,`sizeof(int) = 4`,所以 `sizeof(arr) = 40`。 - 这种写法是安全的,常用于初始化数组。 ### ❌ 情况二:当 `arr` 是**指针**时: ```c int* arr = malloc(10 * sizeof(int)); memset(arr, -1, sizeof(arr)); // 错误! ``` - `sizeof(arr)` 在这里是 **指针大小**(通常是 4 或 8 字节),而不是数组的大小- 所以 `memset(arr, -1, sizeof(arr));` 只会设置前 **4 或 8 个字节**,远小于你分配的内存。 --- ## 🧠 原理解释: ### 1. 数组名 `arr` 的含义: ```c int arr[10]; ``` - `arr` 表示整个数组的起始地址。 - `sizeof(arr)` 返回的是整个数组的大小:`10 * sizeof(int)` ### 2. 指针变量 `arr` 的含义: ```c int* arr = malloc(10 * sizeof(int)); ``` - `arr` 是一个指针,指向动态分配的内存。 - `sizeof(arr)` 返回的是指针本身的大小(32 位系统下是 4 字节,64 位下是 8 字节)。 --- ## ✅ 正确做法(当使用指针时): ```c int* arr = malloc(10 * sizeof(int)); if (arr != NULL) { memset(arr, -1, 10 * sizeof(int)); // 正确方式 } ``` 或使用 `calloc` 初始化为 0: ```c int* arr = calloc(10, sizeof(int)); // 自动初始化为 0 ``` --- ## 📌 总结表格: | 表达式 | 类型 | 含义 | `sizeof(arr)` 结果 | |--------|------|------|-------------------| | `int arr[10];` | 数组 | 整个数组 | `10 * sizeof(int)` | | `int* arr = malloc(...);` | 指针 | 指向动态内存 | `sizeof(int*)`(4 或 8 字节) | --- ## ✅ 示例代码对比: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { // 情况一:数组 int arr1[10]; printf("sizeof(arr1) = %zu\n", sizeof(arr1)); // 输出 40 (32位) 或 80 (64位) memset(arr1, -1, sizeof(arr1)); // 情况二:指针 int* arr2 = malloc(10 * sizeof(int)); printf("sizeof(arr2) = %zu\n", sizeof(arr2)); // 输出 8 (64位) 或 4 (32位) memset(arr2, -1, 10 * sizeof(int)); // 正确写法 free(arr2); return 0; } ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值