异或操作后指针变量变化疑问及char*异或程序无输出咨询
你的异或指针问题分析与解决
1. 函数调用后b1(即main里的buffer)确实会被修改
你传递给xorBlocks的是buffer的指针,虽然C++里函数参数是值传递,但这个指针指向的是堆上分配的同一块内存空间。所以在xorBlocks里修改b1[i],本质就是直接修改main函数中buffer指向的内存内容——只要指针有效,这种原地修改肯定会生效,这点不用怀疑。
2. std::cout无输出的原因
你用的初始值是"00111",每个字符对应的ASCII码是:
- '0' = 48(十进制)
- '1' = 49(十进制)
因为buffer和previousBlock都被memcpy填充了完全相同的5个字节,所以每个位置的异或操作都是相同值异或,结果必然是0(比如48^48=0,49^49=0)。而ASCII码0对应的是空字符'\0',std::cout输出字符串时,遇到第一个'\0'就会停止输出,所以你看不到任何内容。
如果想验证异或后的实际结果,别直接输出字符串,可以逐个字节打印数值:
for (int i = 0; i <5; i++) { std::cout << (int)b1[i] << " "; } // 会输出:0 0 0 0 0
3. 代码里的其他小问题
- 内存泄漏:你用
malloc分配了两块内存,但没有用free释放。虽然程序退出时系统会回收内存,但养成良好习惯很重要,记得在return 0前加上:free(buffer); free(previousBlock); - 字符串终止符问题:
"00111"实际是6个字节(5个字符+1个'\0'),但你memcpy只复制了5个字节,所以previousBlock和buffer里的内容没有字符串终止符。如果用printf输出的话,可能会打印出后面的垃圾数据(直到遇到内存中的'\0'),这点要注意。
内容的提问来源于stack exchange,提问作者Alex544
相关产品推荐
相关产品推荐

