gpt4 book ai didi

关于数组是 "zeroed out"的困惑

转载 作者:太空宇宙 更新时间:2023-11-04 00:20:11 27 4
gpt4 key购买 nike

#include<stdio.h>
#include<stdlib.h>

static char mem[4];

int main()
{
int* A = (int*)(mem);

mem[0] = 0;
mem[1] = 1;
mem[2] = 2;
mem[3] = 3;

int i;
A[0] = 5;

for (i = 0; i<4; i++)
{
printf("%d\t", mem[i]);
}

printf("\n");
return 0;
}

我的问题是,为什么打印出 5 0 0 0 而不是 5 1 2 3?为什么阵列被“消灭”了?

最佳答案

你的情况

A[0] = 5;

5 写为 integer,其大小大于 char(2、4、8,视情况而定)。

你的系统似乎是小端,所以 5 写在第一个 char 位置,然后是零。

请注意,如果 sizeof(int) 为 8(因为它可能发生在某些系统上),您的代码是不安全的并且会触发 未定义的行为,因为它会覆盖超过mem 数组(更不用说可能会减慢操作速度甚至在某些处理器上崩溃的可能错位问题)

这就是为什么我们必须尊重 strict aliasing rule例如,为了避免“对编译器说谎”,创建一个 union 以便编译器可以调整对齐和检查大小。

此其他问答相关:What happens when you cast a char * address to int * in C when the address is not word-aligned?

关于关于数组是 "zeroed out"的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48815160/

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