相同筛素数代码在Visual Studio 2019与Linux运行结果不一致求助
问题根因
- 错误出自构造函数中
memset(arr, true, sizeof(arr));一行 arr是bool*类型的指针,sizeof(arr)获取的是指针本身的内存占用,而非指向的动态数组的总大小:32位环境下固定为4字节,64位环境下固定为8字节,因此该行代码仅能将数组前4/8个元素设置为true,剩余元素的值为未定义的堆内存脏数据- 不同平台的堆内存默认值存在差异:Visual Studio 调试模式会对新申请的堆内存做统一填充,刚好符合你的执行预期;Linux环境下新申请的堆内存为随机值,因此素数筛逻辑中大于7(64位环境对应前8个元素的最大索引)的位置判断全部异常,最终只能输出10以内的素数
修复方案
两种可落地的修复方式二选一即可:
- 修正memset参数,传入正确的数组总字节数
将原memset行替换为:
memset(arr, 1, sizeof(bool) * (N + 1));
注:memset为按字节赋值,bool类型非0即为true,因此填1即可将所有元素设为true。
- 使用C++标准库函数完成初始化,避免手动计算内存大小
首先引入algorithm头文件:
#include <algorithm>
再将原memset行替换为:
std::fill(arr, arr + N + 1, true);
优化建议
可以用std::vector<bool>替代原生动态数组,自动管理内存,从语法层面避免sizeof取指针大小的低级错误,也无需手动写析构函数释放内存。
内容的提问来源于stack exchange,提问作者Yonghyeon Shin
相关产品推荐
相关产品推荐

