C++ 我试图理解xor操作后指针变量的变化

C++ 我试图理解xor操作后指针变量的变化,c++,pointers,char-pointer,C++,Pointers,Char Pointer,我有一个小程序,它对两个字符*执行异或运算,但我不能判断b1在函数调用后是否发生了变化。当我尝试执行std::cout时,程序不会打印任何内容 #include <iostream> #include <malloc.h> #include <cstring> void xorBlocks(char *b1, char *b2) { for (int i = 0; i <5; i++) { b1[i] ^= b2[i]; } std:

我有一个小程序,它对两个字符*执行异或运算,但我不能判断b1在函数调用后是否发生了变化。当我尝试执行std::cout时,程序不会打印任何内容

#include <iostream>
#include <malloc.h>
#include <cstring>

void xorBlocks(char *b1, char *b2) {
  for (int i = 0; i <5; i++) {
    b1[i] ^= b2[i];
 }
  std::cout <<b1; 
}

int main()
{   
char* buffer = (char *) malloc(10);
char* previousBlock = (char *) malloc(10);
const char *iv = (const char *)"00111";
//printf(iv);
memcpy(previousBlock, iv, 5);
//printf(previousBlock);
memcpy(buffer, iv, 5);
//printf(buffer);
xorBlocks((char *) buffer, (char *) previousBlock);
return 0;
}
#包括
#包括
#包括
无效xorBlocks(字符*b1,字符*b2){
对于(int i=0;i此函数

void xorBlocks(char *b1, char *b2) {
  for (int i = 0; i <5; i++) {
    b1[i] ^= b2[i];
 }
  std::cout <<b1; 
}

都是多余的,你可以直接写

const char *iv = "00111";

函数应该声明为

void xorBlocks(char *b1, const char *b2);
因为指针b2指向的字符在函数中不会更改


和C++中,你应该使用new new来代替函数Malc。

你尝试使用两个相同的值的XOR。
const char *iv = (const char *)"00111";
memcpy(previousBlock, iv, 5);
memcpy(buffer, iv, 5);
如果两位相同(均为0或均为1),则xor返回0

因此,您有一行(
buffer
)=
\0\0\0\0

如果您无法理解字符串中的内容,只需打印所有字符的代码即可

for (char c : buffer)
    std::cout << int(c) << ' ';
for(字符c:缓冲区)

std::cout所有这些
(char*)
(const char*)
禁用类型安全。唯一需要的是
malloc
旁边的那些,但是
malloc
不应该在这里使用。
char buffer[10];
要好得多,即使是
std::array buffer;
也值得考虑。
b1
b2
的第一个字节都是“0”(十进制48)“'0'异或'0'的计算结果为0。因此b1的第一个字节变为0,这意味着
b1
是一个空字符串,并且不打印任何内容。
x^x
对于所有整数
x
。在我看来,
b1
std::cout
用作
b1[0]时指向以空结尾的字符串
将是
'\0'
@FrançoisAndrieux,您正在编写。我没有注意。@vladfromscow由于提供给它的值,这一次恰好是正确的,但是
xorblock
也可以从其他情况下的保证中受益。
xorBlocks( buffer, previousBlock);
void xorBlocks(char *b1, const char *b2);
const char *iv = (const char *)"00111";
memcpy(previousBlock, iv, 5);
memcpy(buffer, iv, 5);
for (char c : buffer)
    std::cout << int(c) << ' ';