为什么memset在appleclang编译器中工作出错?

我发现用 C++ 解决问题有些奇怪。

用循环初始化整数数组效果很好,但用 memset 函数初始化它会出错。

下面是示例程序。

#include <cstdio>
#include <limits>
#include <cstring>

using namespace std;

const int SIZE = 10;
const int INF = numeric_limits<int>::max();

int arr1[SIZE];
int arr2[SIZE];

void printArray(int *arr, int n)
{
    for(int i = 0; i < n; i++)
        printf("%-10d ", arr[i]);
}

int main()
{
    // init with loop
    for(int i = 0; i < SIZE; i++)
        arr1[i] = INF;
    printf("nINIT WITH LOOPn");
    printArray(arr1, SIZE);

    // init with memset
    memset(arr2, INF, sizeof(arr2));
    printf("nINIT WITH MEMSETn");
    printArray(arr2, SIZE);

    return 0;
}

结果 :

INIT WITH LOOP
2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 
INIT WITH MEMSET
-1         -1         -1         -1         -1         -1         -1         -1         -1         -1                                 

我是否误解了如何使用 memset 功能?或者这是一个错误吗?

供参考,我的编译器版本如下。

kimseokjin@MacBook-Air LovePS % g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

回答

memset将第二个操作数(参数)转换为unsigned char并将其复制到所有目标字节中。在您的情况下,生成的 unsigned char 是0xFF,它复制到所有类型的元素中int,它们的值是 -1。

文档链接:https : //en.cppreference.com/w/cpp/string/byte/memset。

建议:不要使用低级“C”函数,memset除非您非常确定自己在做什么并且确实需要它。您不需要在循环中设置数组值,我们在 C++ 中有算法,如std::fill注释中建议的那样。您可能还想使用std::array普通的“C”数组来代替。

一个更像 C++ 和更易读的替代方案:

std::array<int, SIZE> arr2;
std::fill(std::begin(arr2), std::end(arr2), INF);


以上是为什么memset在appleclang编译器中工作出错?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>