为什么 memset 在 apple clang 编译器中工作错误?
Why memset works wrong in apple clang compiler?
我发现用 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 LOOP\n");
printArray(arr1, SIZE);
// init with memset
memset(arr2, INF, sizeof(arr2));
printf("\nINIT WITH MEMSET\n");
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.
文档 link:https://en.cppreference.com/w/cpp/string/byte/memset。
建议:不要使用像memset
这样的低级“C”函数,除非你非常确定你在做什么并且你真的需要它.您不需要在循环中设置数组值,我们在 C++ 中有 algorithms,例如评论中建议的 std::fill
。您可能还想使用 std::array
而不是普通的“C”数组。
更像 C++ 且可读性更高的替代方案:
std::array<int, SIZE> arr2;
std::fill(std::begin(arr2), std::end(arr2), INF);
我发现用 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 LOOP\n");
printArray(arr1, SIZE);
// init with memset
memset(arr2, INF, sizeof(arr2));
printf("\nINIT WITH MEMSET\n");
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.
文档 link:https://en.cppreference.com/w/cpp/string/byte/memset。
建议:不要使用像memset
这样的低级“C”函数,除非你非常确定你在做什么并且你真的需要它.您不需要在循环中设置数组值,我们在 C++ 中有 algorithms,例如评论中建议的 std::fill
。您可能还想使用 std::array
而不是普通的“C”数组。
更像 C++ 且可读性更高的替代方案:
std::array<int, SIZE> arr2;
std::fill(std::begin(arr2), std::end(arr2), INF);