gpt4 book ai didi

c - 将 int 数组转换为 short* 时,为什么为元素赋值会覆盖整个整数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:38 25 4
gpt4 key购买 nike

我正在看 Jerry Cain 的 Programming Paradigms Lecture 3 video其中演示了在 int 数组和 short 数组之间转换后元素分配的效果。本质上的论点是,如果您要分配一个 int 数组元素 arr[3] = 128,则临时将 int 数组转换为 short* 并分配 arr[6] = 2,则 arr[3] 应变为 128 + 512 = 640,因为 2 将被解释为位于第 2^9 个位置。演示代码:

#include <stdio.h>

int main() {
printf("sizeof(int) is %lu\n", sizeof(int));
printf("sizeof(short) is %lu\n", sizeof(short));
int arr[5];
arr[3] = 128;
((short*)arr)[6] = 2;
printf("arr[3] is equal to %d\n", arr[3]); //expect 640, get 2 instead
return 0;
}

当我运行这段代码时,我得到以下输出:

sizeof(int) is 4
sizeof(short) is 2
arr[3] is equal to 2

我希望 arr[3] 等于 640,但它只是等于 2。我是公认的 C 菜鸟 - 谁能解释一下?

最佳答案

我认为是大端还是小端。

代码本质上是特定于平台的(官方的,几乎可以肯定是未定义的行为)。我不确定您是否应该学习它,但我想那是另一个问题。

2 被分配给 arr[3] 的四个字节中的两个。如果您改为分配给 ((short *)arr)[7],您可能会看到预期的结果。

你在什么机器上测试(什么类型的 CPU)?


转念一想 - 虽然部分问题可能是大端与小端,但另一个问题是 shortchar。下面是更多代码,显示了解决方案的各种途径:

#include <stdio.h>

int main(void)
{
printf("sizeof(int) is %lu\n", sizeof(int));
printf("sizeof(short) is %lu\n", sizeof(short));
int arr[5];

arr[3] = 128;
((short*)arr)[6] = 2;
printf("arr[3] is equal to %8d (0x%08X)\n", arr[3], arr[3]);

arr[3] = 128;
((short*)arr)[7] = 2;
printf("arr[3] is equal to %8d (0x%08X)\n", arr[3], arr[3]);

for (int i = 12; i < 16; i++)
{
arr[3] = 128;
((char *)arr)[i] = 2;
printf("arr[3] is equal to %8d (0x%08X) i = %d\n", arr[3], arr[3], i);
}

return 0;
}

修改后的代码输出为:

sizeof(int) is 4
sizeof(short) is 2
arr[3] is equal to 2 (0x00000002)
arr[3] is equal to 131200 (0x00020080)
arr[3] is equal to 2 (0x00000002) i = 12
arr[3] is equal to 640 (0x00000280) i = 13
arr[3] is equal to 131200 (0x00020080) i = 14
arr[3] is equal to 33554560 (0x02000080) i = 15

使用 GCC 4.2.1 XCode 4.2 (LLVM) 在 MacOS X 10.7.2 上进行测试。

关于c - 将 int 数组转换为 short* 时,为什么为元素赋值会覆盖整个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8697641/

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