C/C++——基本数据类型的大小并且sizeof(int *) = 8

本文详细解释了C++中sizeof运算符的功能及其在不同编译器环境下(32位与64位)的行为差异,包括基本类型、指针类型以及枚举类型的大小。通过具体示例,揭示了在64位编译器上sizeof(int*)和sizeof(char*)为8字节的原因,即地址为64位寻址的特点。
部署运行你感兴趣的模型镜像
#include <iostream>
using namespace std;

int main()
{
    cout << "sizeof(bool) = " << sizeof(bool) << endl;
    cout << "sizeof(char) = " << sizeof(char) << endl;
    cout << "sizeof(int) = " << sizeof(int) << endl;
    cout << "sizeof(float) = " << sizeof(float) << endl;
    cout << "sizeof(double) = " << sizeof(double) << endl;
    cout << "sizeof(long double) = " << sizeof(long double) << endl;

    enum e{a, b=3};

    cout << "sizeof(enum) = " << sizeof(e) << endl;
    cout << "sizeof(int *) = " << sizeof(int *) << endl;
    cout << "sizeof(char *) = " << sizeof(char *) << endl;


    return 0;
}


运行结果:

sizeof(bool) = 1
sizeof(char) = 1
sizeof(int) = 4
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 16
sizeof(enum) = 4
sizeof(int *) = 8
sizeof(char *) = 8

主要是在ubuntu64位下面sizeof(int *) 和 sizeof(char *)是8字节,也就是地址是64位。

解释是:在32位编译器上sizeof(指针)是4字节。在64位编译器上sizeof(指针)是8字节。32位地址最大寻址为4G=2^32,64位最大寻址为128T=2^64。




您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>好的,我现在需要帮助用户理解这段代码:`int* arr = (int*)malloc(10 * sizeof(int));`。用户之前已经询问过void指针,现在可能对malloc和类型转换不太清楚。 首先,用户可能对malloc的作用不了解,需要解释动态内存分配的概念。他们可能来自静态数组的使用背景,所以需要对比两者的区别,比如动态分配的内存大小在运行时决定,而静态数组在编译时确定。 接下来,用户可能对`(int*)`这个类型转换感到困惑。之前讨论过void指针,但用户可能还没完全理解为什么需要转换。需要强调malloc返回的是void指针,必须转换成具体类型才能使用,否则编译器会报错。 然后,分解代码的每个部分。比如,`malloc(10 * sizeof(int))`分配了10个int的空间,这里要说明sizeof(int)的作用是确保不同系统上int大小正确。用户可能不知道sizeof的用途,需要举例说明,比如在4字节int的系统上,这里分配的是40字节。 用户可能对指针类型转换的安全性有疑问,需要解释为什么需要显式转换,尤其是在C++中,而在C中可能可以隐式转换,但为了代码清晰和跨语言兼容,最好显式转换。 另外,用户可能不清楚动态分配后的内存如何管理,需要提醒他们记得使用free(arr)来释放内存,避免内存泄漏。这时候可以简要提到内存泄漏的后果,增加理解。 还要考虑用户可能对指针和数组的关系有疑问,比如arr现在可以当作数组使用,比如arr[0] = 5。可能需要解释指针和数组在C中的互换性,但也要指出动态分配的数组和栈上数组的区别。 用户可能的误区包括认为malloc会初始化内存,但实际上malloc分配的是未初始化的内存,可能需要使用calloc来初始化为零。这也是需要注意的地方。 最后,总结整个代码的作用,强调动态分配数组的灵活性和使用时的注意事项,比如检查malloc是否返回NULL,确保分配成功。这样用户就能全面理解这段代码的意义和正确使用方法了。</think>让我们通过分解代码 `int* arr = (int*)malloc(10 * sizeof(int));` 来逐步理解其含义和作用: --- ### **一、代码结构解析** ```c int* arr = (int*)malloc(10 * sizeof(int)); ``` 可拆解为三个关键部分: 1. `malloc(10 * sizeof(int))` —— 内存分配 2. `(int*)` —— 类型强制转换 3. `int* arr` —— 指针变量声明 --- ### **二、分步详解** #### **1. 计算内存大小** - `sizeof(int)`:获取`int`类型占用的字节数 - 32位系统:通常为4字节 - 64位系统:通常为4字节(注意:实际大小由编译器决定) - `10 * sizeof(int)`:计算需要分配的总字节数 - 示例:若 `sizeof(int)=4`,则分配 $10 \times 4 = 40$ 字节 #### **2. malloc函数** - **作用**:向操作系统申请一块**未初始化**的连续内存 - **返回值**:成功时返回`void*`(通用指针),失败返回`NULL` - **等效图示**: ```c // 内存分配结果(假设sizeof(int)=4): +---+---+---+---+...+---+ | 0 | 4 | 8 |12 |...|36 | <-- 字节偏移量 +---+---+---+---+...+---+ ``` #### **3. 类型强制转换** - `(int*)`:将`malloc`返回的`void*`转换为`int*`类型指针 - **必要性**: - `void*`不能直接用于访问数据(无法确定数据类型) - 明确告诉编译器内存块将被视为`int`数组使用 #### **4. 指针变量声明** - `int* arr`:声明一个指向`int`类型的指针变量 - **内存映射关系**: ```c arr → 指向内存块首地址(相当于数组名) arr[0] → 首元素 arr[9] → 最后一个元素 ``` --- ### **三、等效写法对比** #### 传统写法(更清晰): ```c int* arr; arr = (int*)malloc(10 * sizeof(int)); ``` #### 错误写法(后果严重): ```c int* arr = malloc(10 * sizeof(int)); // C++编译报错,C编译警告 // 缺少类型转换会导致类型不匹配 ``` --- ### **四、内存布局可视化** 假设系统为`int`分配4字节: ``` 内存地址 内容(未初始化) 对应数组索引 0x1000 [随机值] arr[0] 0x1004 [随机值] arr[1] 0x1008 [随机值] arr[2] ... 0x1028 [随机值] arr[9] ``` --- ### **五、使用注意事项** 1. **必须检查分配结果**: ```c if(arr == NULL) { printf("内存分配失败!"); exit(1); } ``` 2. **访问元素**: ```c arr[0] = 100; // 合法操作 *(arr+1) = 200; // 等价于arr[1] = 200 ``` 3. **释放内存**: ```c free(arr); // 使用后必须释放 arr = NULL; // 避免野指针 ``` --- ### **六、与静态数组对比** | 特性 | 动态数组(本代码) | 静态数组 `int arr[10]` | |-------------|------------------------|-----------------------| | 内存位置 | 堆(heap) | 栈(stack) | | 生命周期 | 手动控制(需free) | 自动释放(离开作用域)| | 大小确定时机 | 运行时 | 编译时 | | 可调整大小 | 支持(realloc) | 不可调整 | --- ### **七、典型应用场景** 1. 需要根据用户输入决定数组大小: ```c int n; scanf("%d", &n); int* dynamic_arr = (int*)malloc(n * sizeof(int)); ``` 2. 处理超大数据(避免栈溢出): ```c // 栈空间有限(通常约1-8MB) // int huge_arr[1000000]; // 可能崩溃 int* safe_arr = (int*)malloc(1000000 * sizeof(int)); // 安全 ``` 3. 函数间传递动态数据: ```c int* create_array(int size) { return (int*)malloc(size * sizeof(int)); } ``` --- > **进阶知识**:在C++中更推荐使用 `new` 运算符: > ```cpp > int* arr = new int[10]; // C++风格 > delete[] arr; // 对应释放方式 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值