strlen在C语言中没有给出正确的长度

时间:2016-03-04 23:39:44

标签: c

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

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,但它只有两个。为了让事情更加混乱,这有效:

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 */

我是否应该像这样得到阵列的长度,或者我做错了什么?

1 个答案:

答案 0 :(得分:8)

根据您计算机的字节顺序,内存中的int16_t可以是\0\x16\x16\0。在您的情况下,它是\0\x16str处的内存最终将包含"Q5\0\x16"。因此strlen(str)正确返回2,因为\0字节终止了C风格的字符串。

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