You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相同筛素数代码在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以内的素数
修复方案

两种可落地的修复方式二选一即可:

  1. 修正memset参数,传入正确的数组总字节数
    将原memset行替换为:
memset(arr, 1, sizeof(bool) * (N + 1));

注:memset为按字节赋值,bool类型非0即为true,因此填1即可将所有元素设为true。

  1. 使用C++标准库函数完成初始化,避免手动计算内存大小
    首先引入algorithm头文件:
#include <algorithm>

再将原memset行替换为:

std::fill(arr, arr + N + 1, true);

优化建议

可以用std::vector<bool>替代原生动态数组,自动管理内存,从语法层面避免sizeof取指针大小的低级错误,也无需手动写析构函数释放内存。

内容的提问来源于stack exchange,提问作者Yonghyeon Shin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:06:03