C++中memset处理动态数组的异常行为原因咨询
关于C++中memset处理栈数组与动态数组的差异问题
核心原因:sizeof的作用对象类型完全不同
- 栈上数组场景:声明
int dp[5];时,dp是数组类型(具体为int[5]),并非指针。此时sizeof(dp)直接计算整个数组的总字节数,即sizeof(int) * 5。memset以该值作为第三个参数,刚好覆盖数组所有字节,因此所有元素能被正常置0。 - 动态数组场景:写
int *dp = new int[5];时,dp是指针变量,仅用于存储动态数组的首地址。此时sizeof(dp)计算的是指针本身的字节数(32位系统为4字节,64位系统为8字节)。由于一个int通常占4字节,memset仅能修改前1个(64位)或2个(32位)int元素的字节,剩余元素未被覆盖,因此保留垃圾值。
动态数组的正确处理方式
你提到的memset(dp, 0, sizeof(dp[0]) * n)是正确方案:sizeof(dp[0])获取单个int的字节数,乘以元素个数n得到动态数组的总字节数,memset以此值作为参数即可覆盖所有元素,实现全部置0。
内容的提问来源于stack exchange,提问作者Cash flow
相关产品推荐
相关产品推荐

