Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中一次将4个字节分配到字符数组的特定索引中+;_C++_Arrays - Fatal编程技术网

C++ 如何在C+中一次将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

我想用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] = (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);