gpt4 book ai didi

c - 在 C 中的 memcpy 之后 strlen 没有给出正确的长度

转载 作者:行者123 更新时间:2023-11-30 19:54:32 25 4
gpt4 key购买 nike

我对这个问题很困惑。代码如下:

char str[256];
memcpy(&str[0], "Q", 1);
memcpy(&str[1], "5", 1); // everything fine so far
int16_t lenQ = 22;
memcpy(&str[2], (char*)&lenQ, sizeof(int16_t));
str[2 + sizeof(int16_t)] = (char) NULL;
printf("%i\n", strlen(str)); // prints out 2??

逻辑上str的长度应该是4,但实际上只有2。为了让事情变得更加困惑,这是有效的:

int16_t raw = 0;
memcpy(&raw, &str[2], 2);
printf("%i\n", raw) // prints out 22 as expected

所以 str 的大小不正确,但我仍然可以实际访问“越界”值。我是否理解错误了?据我了解,str数组内部应该是这样的:

'Q', '5', /* 22 in bytes, which is 2 in this case */

我是否应该像这样获取数组的长度,还是我做的事情完全错误?

最佳答案

内存中的 int16_t 可能是 \0\x16\x16\0,具体取决于计算机的字节顺序。在您的情况下,它是 \0\x16 并且 str 处的内存最终将包含 "Q5\0\x16"。因此,strlen(str) 正确返回 2,因为 \0 字节终止了 C 样式字符串。

如果您希望结果为 "Q522",则 int16_t 类型的 lenQ 变量的值应为 12850 (对于所有合理的 CPU 架构)以两个字节的形式存储在内存中,值为 50(基数为 16 的 0x32)或 ASCII 字符 '2' .

关于c - 在 C 中的 memcpy 之后 strlen 没有给出正确的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35808055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com