gpt4 book ai didi

c++ - 通过内存集初始化值

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:16 25 4
gpt4 key购买 nike

我使用了一个数组作为 dt[100];然后,我初始化了像 memset(dt,63,sizeof(dt)); 这样的值。然后我看到了在这些数组中分配的值,如 4557430888798830399。我可以解释一下吗?

#include <bits/stdc++.h>
#define ll long long int
using namespace std;
ll dt[100];
int main()
{

memset(dt,63,sizeof(dt));
cout<<dt[0]<<endl;

}

最佳答案

嗯,这里的答案几乎是正确的。
最灵活、正确的解决方案是使用 std::fillstd::begin + std::end

std::fill(std::begin(dt),std::end(dt),63);
  1. 您应该使用 std::fill 而不是 memset,因为 std::fill 知道对象并将调用正确的赋值手术。 memset 只知道一个字节是什么(C 与 C++)。
  2. memset 填充字节,std::fill 填充任意大小的任意变量
  3. std::fill 如果变量大小等于一个字节大小(是的,标准库不是就像我们认为的那样愚蠢..)
  4. std::begin + std::end “知道”C 数组的大小,所以没有像 arr , arr + 100 数组大小改变时中断
  5. std::begin + std::end 使用 C 数组和任何提供 begin() 的 C++ 容器end() 方法(vector、deque、list 等)。因此无需付出任何努力,代码就通用(例如,sizeof 技巧不适用于std::vector)。<

至于为什么 long long 有这么奇怪的值,是因为 memset 填充了每个字节 而不是每个 long long
所以,假设每个 long long 都是 8 个字节,在内存方面,memset 之后的 long long 看起来像

byte
|
V
[63][63][63][63][63][63][63][63]
^ ^
| long long |

和二进制:

0011111100111111001111110011111100111111001111110011111100111111 
//63 == 00111111, 8 bytes of each

这是:

4557430888798830399

(为了不让主题过于复杂,我故意没有深入讨论字节顺序的细节)

关于c++ - 通过内存集初始化值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com