memset() 与 std::fill()

问题描述 投票:0回答:1

谁能告诉我 c++ 中

memset()
std::fill()
之间的区别吗?

我很困惑为什么我的代码不能与

memset()
一起使用,但可以与
std::fill()
一起使用。

我正在像往常一样制作埃拉托色尼筛,我期待我的筛有一系列 1 和 0 但它一直给我这个号码“72340172838076673”

这是我的代码:

#include <bits/stdc++.h>
using namespace std;
long long s[2000009],a[1000009],i,j,n;
void seive(int N) {
    j = 1;
    memset(s,1,sizeof(s));
    s[0] = 0;
    s[1] = 0;
    for(int i = 2; i <= sqrt(N); i++) {
        if(s[i] == 1)
            for(int j = i * i; j <= N; j += i) {
                s[j] = 0;
            }
    }
}

int main () {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin>>n;
    seive(2e6);
    for (i = 1 ; i <= n ; i++) {
       cin>>a[i];
       cout<<s[a[i]]<<'\n';
    }
}
c++ std memset std-algorithm
1个回答
2
投票

std::fill()
的文档说:

val 分配给 [first,last) 范围内的所有元素。"

这意味着

std::fill
适用于任何数据类型。

另一方面,memset()

文档说:

ptr 指向的内存块的前 num 字节设置为指定的 value(解释为无符号字符)。”。

这意味着

memset()
仅适用于字节。如果您的值数组不是字节数组,或者要填充的值不是字节,它们仍将被解释为字节,这意味着您极不可能获得任何有意义的内容。

© www.soinside.com 2019 - 2024. All rights reserved.