【问题标题】:I try to understand what pointer variable is changing after xor operation我试图了解 xor 操作后指针变量发生了什么变化
【发布时间】:2020-04-19 06:57:44
【问题描述】:

我有一个对两个 char* 执行异或运算的小程序,但我不知道在函数调用之后 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;
}

【问题讨论】:

  • 所有(char *)(const char *) 禁用类型安全。唯一需要的是malloc 旁边的那些,但这里不应使用mallocchar buffer[10]; 要好得多,即使这样 std::array&lt;char, 10&gt; buffer; 也值得考虑。
  • b1b2 的第一个字节是 '0'(十进制 48)。 '0' xor '0' 计算结果为 0。因此 b1 的第一个字节变为 0,这意味着 b1 是一个空字符串,并且不打印任何内容。
  • x ^ x 对于所有整数 x 为零。

标签: c++ pointers char-pointer


【解决方案1】:

您正在尝试对两个相同的值使用 xor。

const char *iv = (const char *)"00111";
memcpy(previousBlock, iv, 5);
memcpy(buffer, iv, 5);

如果两个位相同(均为 0 或均为 1),则 xor 返回 0。

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

如果你看不懂字符串里面的内容,就打印所有字符的代码。

for (char c : buffer)
    std::cout << int(c) << ' ';

【讨论】:

    【解决方案2】:

    这个函数

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

    不执行应用于指针 b1 和 b2 的 XOR 操作。它执行应用于这些指针指向的字符的 XOR 操作。所以指针本身不会改变。是指针 b1 指向的字符发生了变化。

    而且由于指针b1所指向的第一个字符的指针会变成0,所以这个语句不会输出任何东西

      std::cout <<b1; 
    

    具有未定义的行为。

    注意这些铸件

    const char *iv = (const char *)"00111";
    

    xorBlocks((char *) buffer, (char *) previousBlock);
    

    是多余的。你可以写

    const char *iv = "00111";
    

    xorBlocks( buffer, previousBlock);
    

    并且函数应该像这样声明

    void xorBlocks(char *b1, const char *b2);
    

    因为指针 b2 指向的字符在函数中没有改变。

    在 C++ 中,您应该使用运算符 new 而不是函数 malloc。

    【讨论】:

    • 在我看来,b1std::cout 被用作 b1[0] 时将指向一个空终止字符串,因为 b1[0] 将是 '\0'
    • @FrançoisAndrieux 你写的。我没有专心。
    • @VladfromMoscow 由于提供给它的值,这次恰好是真的,但xorBlocks 也可能受益于其他情况的保证。
    猜你喜欢
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2015-06-08
    • 1970-01-01
    • 2012-06-03
    • 2016-10-18
    相关资源
    最近更新 更多