【发布时间】:2021-06-23 18:37:43
【问题描述】:
char* p = (char*) malloc(8 * sizeof(char));
strcpy(p, "fungus");
for (int i = 0; i < strlen(p); i++) {
printf("%c", p[i]);
}
char* p2 = (char*) malloc(4 * sizeof(char));
*p2 = *(uint16_t*) p;
printf("\nPointer: %c\n", p2[1]);
所以我创建了一个 char* p 来存储字符串“fungus”。 据我了解,如果我将 p 类型转换为 uint16_t* 并取消引用它,则返回的值应该是 p 指向的前 2 个字节。因此,p2[1] 应该是“u”,因为“u”是字符串“fungus”中的第二个字节。但是,当我运行我的程序时,情况并非如此。我也尝试打印 p[0] + 1,但这只是输出“g”。我的逻辑有问题吗?
【问题讨论】:
-
好吧,除了严格地说您不能将 char 指针强制转换为任何奇数类型之外,这通常可以按预期工作。观察:(1)
p[0] + 1是'f' + 1,其中是'g'; (2)*p2 = *(uint16_t*) p给一个char(即*p2,也就是p2[0])赋值一个16位的int值,超出了一个char的取值范围。 (3)p2[1],与你所想的相反,从未被分配。 -
还要考虑您正在使用的系统的字节序。当您将该 char 指针强制转换为 unit16 指针时,可以以不同的顺序读取字节。