unsigned char 上的按位 XOR 正在终止程序而不会出错

Bitwise XOR on unsigned char is terminating program without error

我正在尝试在 C++ 中创建一个 64 位整数作为 class,我知道它已经存在于 C 头文件中 stdint.h,但我认为这可能是一个有趣的挑战。

无论如何,我正在尝试对三个无符号字符执行按位异或运算,并且程序一直在没有警告的情况下停止,它只是暂停了一秒钟然后停止:

unsigned char* a = (unsigned char*) 1;
unsigned char* b = (unsigned char*) 2;
unsigned char* c = (unsigned char*) 3;

unsigned char* result = (unsigned char*) malloc(sizeof(unsigned char));

std::cout << "Trying" << std::endl;
*result = *a ^ *b ^ *c;
std::cout << "Done!" << std::endl;

输出为:

PS C:\Users\super\Desktop> ./test.exe
Trying
PS C:\Users\super\Desktop>

我正在使用 Windows 10 如果有帮助,如果您需要任何其他信息,请告诉我,感谢您能给我的任何帮助:)

您正在尝试取消引用无效指针。你想摆脱很多 *s.

unsigned char a = 1;
unsigned char b = 2;
unsigned char c = 3;

unsigned char* result = (unsigned char*) malloc(sizeof(unsigned char));

std::cout << "Trying" << std::endl;
*result = a ^ b ^ c;
std::cout << "Done!" << std::endl;

为什么要在堆上为结果分配单个字节(sizeof(unsigned char) 根据定义是 1)?您也可以将其设为另一个 unsigned char 变量。

编者注:你也don't need to use std::endl

您的代码正在崩溃,因为您正在取消引用指针 abc,这些指针未指向可读取的有效内存地址。

向您展示如何重写此代码以完全不为 abc.

使用指针

但是,如果出于某种原因,您确实需要将整数 type-casted 作为指针传递(例如,因为您要通过需要此操作的 C API 传递它们),那么您需要 type-cast 将指针变回整数,而不是 取消引用 指针,例如:

unsigned char* a = reinterpret_cast<unsigned char*>(static_cast<std::uintptr_t>(1));
unsigned char* b = reinterpret_cast<unsigned char*>(static_cast<std::uintptr_t>(2));
unsigned char* c = reinterpret_cast<unsigned char*>(static_cast<std::uintptr_t>(3));

unsigned char* result = new unsigned char;

std::cout << "Trying" << std::endl;
*result = static_cast<unsigned char>(reinterpret_cast<std::uintptr_t>(a))
        ^ static_cast<unsigned char>(reinterpret_cast<std::uintptr_t>(b))
        ^ static_cast<unsigned char>(reinterpret_cast<std::uintptr_t>(c));
std::cout << "Done!" << std::endl;

...

delete result;