动态数组的sizeof失效?无法使用memset(a, 0, sizoef(a)) ?

本文探讨了C++中动态数组的sizeof运算符的使用误区及其正确初始化方式。由于sizeof在编译时计算,对于动态数组它返回的是指针的大小,而非实际数组的大小。示例代码展示了如何在memset中正确设置动态数组的大小,以避免仅设置指针大小的错误。正确的初始化应当基于数组元素数量乘以元素类型大小。

sizeof(Dynamic Arrary)

动态数组的sizeof

首先需要明白sizeof是在编译时由编译器进行推导大小,如果我们对Dynamic Array即动态数组使用sizeof,编译器在编译时对其推导,推出为指针大小(depends on pointer size)4 bytes / 8 bytes

举个🌰

void foo(int n) {
int *p;
p = new int[n];
memset(p, -1, sizeof(p));//编译器无法得知n的大小,会将其推导为指针大小,所以memset只set了一个指针大小
}

正确的初始化

void foo(int n) {
int *p;
p = new int[n];
memset(p, -1, n * sizeof(int))//正确的initialization

int dp[n];
memset(dp, -1, sizeof(dp))
}
<think>首先,用户在问:“为什么在函数内部使用`sizeof`计算数组长度会失效?” 这个问题是基于我之前的回答中提到的注意事项:此方法**不适用于指针**(如函数参数传递的数组会退化为指针)。 我的回答需要: - 使用中文。 - 在回答完问题后,提出3-5个相关问题。 - 相关问题必须以 "§§相关问题§§" 开头,后跟1. 2. 3. 等。 - 禁止换行分散,意思可能是问题列表要紧凑,不要有额外的换行。 关键点解释: - 在C语言中,当数组作为函数参数传递时,它实际上传递的是指向数组第一个元素的指针,而不是整个数组。这就是所谓的“数组退化”。 - 因此,在函数内部,使用`sizeof(arr)` 会返回指针的大小(通常是4或8字节),而不是数组的总大小。 - 而`sizeof(arr[0])` 返回元素的大小,但由于`arr`是指针,`sizeof(arr)` 不是数组的总字节大小。 结构我的回答: 1. 先直接回答问题,解释原因。 2. 提供示例说明。 3. 结尾提出3-5个相关问题。 相关问题应该基于当前问题和回答。可能的想法: 1. 如何在函数中正确获取数组长度? 2. 数组退化的其他影响是什么? 3. 什么是`size_t`类型? 4. 动态数组如何处理长度? 5. 函数参数中如何声明数组以避免退化? 确保相关问题是3-5个,并紧凑输出。 最终输出格式: - 回答内容。 - "§§相关问题§§" 在最后一行开头。 - 接着是问题列表:1. ... 2. ... 3. ... 现在,起草回答。 </think> 在C语言中,在函数内部使用`sizeof(arr) / sizeof(arr[0])`计算数组长度会失效,主要原因是**数组作为函数参数传递时会退化为指针**。以下是详细解释: ### 原因分析 1. **数组退化(Array Decay)**: - 当数组作为函数参数传递时,C语言会将其隐式转换为指向第一个元素的指针。例如: ```c void func(int arr[]) { // 实际等效于 int* arr size_t size = sizeof(arr); // 这里arr是指针,不是数组 } ``` - 此时,`sizeof(arr)` 返回的是指针的大小(通常为4或8字节),而不是数组的总字节大小。 2. **`sizeof` 的行为差异**: - 在函数外部(如`main`中),数组是完整类型: `sizeof(arr)` → 返回整个数组的字节大小(如20字节)。 - 在函数内部,数组退化为指针: `sizeof(arr)` → 返回指针的大小(如8字节),导致计算错误。 ### 示例演示 ```c #include <stdio.h> void wrong_size(int arr[]) { // 尝试计算长度:失败! size_t count = sizeof(arr) / sizeof(arr[0]); printf("函数内部计算长度: %zu\n", count); // 输出可能是1或2(取决于指针大小) } int main() { int arr[5] = {1, 2, 3, 4, 5}; size_t true_count = sizeof(arr) / sizeof(arr[0]); printf("main函数正确长度: %zu\n", true_count); // 输出5 wrong_size(arr); // 调用函数 return 0; } ``` **输出**: ``` main函数正确长度: 5 函数内部计算长度: 2 // 在64位系统中,指针大小为8字节,int大小为4字节 → 8/4=2 ``` ### 解决方法 - **额外传递长度参数**:在调用函数时显式传递数组长度,例如: ```c void correct_func(int arr[], size_t length) { for (size_t i = 0; i < length; i++) { printf("%d ", arr[i]); } } ``` - **避免退化**:使用结构体或全局数组(但通常不推荐)。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值