unsigned char * 根据 c++ 中的操作系统/编译器改变长度

问题描述 投票:0回答:1

我在代码中发现了一个奇怪的错误。我的代码应该与Windows和Linux交叉兼容。我发现当我编译我的程序 windows mingw 时,它在获取其长度时向特定数据类型/变量添加 6 个字节。

我不知道如何进一步解释,所以这就是我发现的

int paddingSize =  strlen((char*)cipherText);

我将 y 定义为 unsigned char *,它是原始加密 aes-256 字节的数组。 当上面的代码片段在linux上编译时,如果数组大小是16字节,则int将为16。 然而,在 Windows 上编译时,每次都会有正好 +6 字节的偏移量。为了解决这个问题,我使用了下面的代码片段

int paddingSize =  strlen((char*)cipherText) - 6;

我想知道为什么会这样?这是编译器问题,例如 mingw vs G++ (GNU)?或者这是一个架构问题?这是否也是一个数据类型问题,其中类型转换在一个操作系统上破坏了它,但在另一个操作系统上却没有?

我尝试了不同的方法,但都得到了令人困惑的答案。

c++ linux g++ typecasting-operator
1个回答
0
投票

strlen
计算字节数,直到找到
'\0'
字符。如果您的
y
指向长度为 16 的字符数组,则
strlen
的结果只会为您提供找到第一个
'\0
' 之前的字符数,完全独立于您的数组有多长!您的程序也有可能只是崩溃,因为您访问了数组后面的内存。

您无法从指向 char 的指针获取数组的长度。

© www.soinside.com 2019 - 2024. All rights reserved.