C++ 如何在C+中一次将4个字节分配到字符数组的特定索引中+;
我想用0初始化字符数组的最后4个字节(将所有32位设置为零)。但是赋值只改变了数组中的一个字节。如何在一个命令中更改此字节和下三个字节,而不是循环所有4个字节?这可能吗C++ 如何在C+中一次将4个字节分配到字符数组的特定索引中+;,c++,arrays,C++,Arrays,我想用0初始化字符数组的最后4个字节(将所有32位设置为零)。但是赋值只改变了数组中的一个字节。如何在一个命令中更改此字节和下三个字节,而不是循环所有4个字节?这可能吗 #include <iostream> #include <iomanip> using namespace std; int main() { char buf[8 + 4]; // 8 bytes of garbage + 4 = 32 safety bits buf[8] = (ui
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
char buf[8 + 4]; // 8 bytes of garbage + 4 = 32 safety bits
buf[8] = (uint32_t)0; // turns all safety bits into zero???
cout << hex << setfill(' ');
for (int i=0; i<8 + 4; i++) {
cout << setw(3) << (int)buf[i];
}
cout << dec << endl;
return 0;
}
如果不想初始化整个数组,可以使用memset或类似函数
#include <string.h>
...
memset(&buf[8], 0, 4);
#包括
...
memset(&buf[8],0,4);
根据这些评论,我添加了一个更像c++的方法来完成同样的工作:
#include <algorithm>
...
std::fill(&a[8],&a[8+4],0);
#包括
...
标准:填充(&a[8],&a[8+4],0);
还有另一个选项:
*(uint32_t*)(&buf[8]) = 0;
或更多的C++方式:
#include <algorithm>
std::fill(buf + 8, buf + 12, 0);
#包括
标准:填充(buf+8,buf+12,0);
为什么不将所有内容初始化为0?i、 e.charbuf[8+4]={0}代码>@PavanYalamanchili,是的,它会起作用。但是,如果我需要在初始化后的某个地方更改四个字节,我需要一个循环吗?如果你觉得有冒险精神,*((int*)(buf+8))=0代码>buf[8]=buf[9]=buf[10]=buf[11]=0代码>@Rodrigo Galik的建议是安全的。危险在于,当您获取一个字符数组时,将指向int的指针指向该数组,然后通过该指针访问它。正如在这个StAcExpLoad问题中所指出的,关于指针混叠的规则在C和C++中都非常严格。我总是感觉到直接命令,例如<代码> *((int *)(BUF + 8))=0;代码>和buf[8]=buf[9]=buf[10]=buf[11]=0注释中给出的代码>,速度更快。虽然我不确定。回到这里,让编译器担心优化这个。考虑到这些年来优化的改进程度,您会惊讶于编译器的工作有多么出色。请看这个例子:注意编译器在编译参数时,如何完全避免使用<代码>修改Fuffy1和修改文件> <代码> >,而它会提前给出答案并直接推到堆栈上。因为这个问题被标记为C++,更合适的解决方案是使用std::fill
@paddy,在填充一系列POD值时,在内部可能需要调用memset
或等效程序。只有现代编译器(例如:gcc>=7)才能生成相同的输出。因此,最好使用uint32\u t*
或memset
而不是多重赋值。而对于MSVC,输出的差异更大。不要依赖编译器@JerryJeremiahThis*(uint32_t*)(&buf[8])
是地狱般的发现!你救了我一天!谢谢
#include <algorithm>
std::fill(buf + 8, buf + 12, 0);