gpt4 book ai didi

c - 结构体/结构体值的内存分配

转载 作者:行者123 更新时间:2023-11-30 20:53:01 26 4
gpt4 key购买 nike

您能否帮助我理解为什么我的 dataStruct 结构的值不是其成员之一的值? (对于simpleDataStruct结构)

我用这一行打印值:

printf("dataStruct:..............0x%X\r\n", dataStruct);

结果是:

dataStruct:..............0x22FE20

我使用海湾合作委员会。

我的代码是:

int main(void)
{
typedef struct Main_SimpleStructData_s
{
unsigned char a;
unsigned char b;
}
Main_SimpleStructData_t;

typedef struct Main_StructuredData_s
{
unsigned char a;
unsigned char* b;
}
Main_StructuredData_t;

unsigned char localDataA = 0xBE;
unsigned char localDataB = 0xEF;
unsigned char localDataC = 0xCA;
unsigned char localDataD = 0xFE;

Main_SimpleStructData_t simpleDataStruct;
Main_StructuredData_t dataStruct;

simpleDataStruct.a = localDataA;
simpleDataStruct.b = localDataB;

dataStruct.a = localDataC;
dataStruct.b = &localDataD;

printf("\r\n");
printf("simpleDataStruct:........0x%X\r\n", simpleDataStruct);
printf("Addr simpleDataStruct: 0x%X\r\n", &simpleDataStruct);
printf("Size simpleDataStruct: %u\r\n", (unsigned)sizeof(simpleDataStruct));
printf("\r\n");
printf("Addr localDataC: 0x%X\r\n", &localDataC);
printf("Size localDataC: %u\r\n", (unsigned)sizeof(localDataC));
printf("Addr localDataD: 0x%X\r\n", &localDataD);
printf("Size localDataD: %u\r\n", (unsigned)sizeof(localDataD));
printf("dataStruct:..............0x%X\r\n", dataStruct);
printf("dataStruct.a: 0x%X\r\n", dataStruct.a);
printf("dataStruct.b: 0x%X\r\n", dataStruct.b);
printf("Addr dataStruct: 0x%X\r\n", &dataStruct);
printf("Addr dataStruct.a: 0x%X\r\n", &(dataStruct.a));
printf("Addr dataStruct.b: 0x%X\r\n", &(dataStruct.b));
printf("Size dataStruct: %u\r\n", (unsigned)sizeof(dataStruct));

return (0);
}

结果是:

simpleDataStruct:........0xEFBE
Addr simpleDataStruct: 0x22FE4A
Size simpleDataStruct: 2

Addr localDataC: 0x22FE4D
Size localDataC: 1
Addr localDataD: 0x22FE4C
Size localDataD: 1
dataStruct:..............0x22FE20
dataStruct.a: 0xCA
dataStruct.b: 0x22FE4C
Addr dataStruct: 0x22FE30
Addr dataStruct.a: 0x22FE30
Addr dataStruct.b: 0x22FE38
Size dataStruct: 16

提前谢谢。

最佳答案

%X 转换采用 unsigned int 参数。您错误地传递了一个struct Main_StructuredData_s,它不是一个unsigned int,这是未定义的行为,所以我不知道为什么您会期望看到一些合理的结果.

编辑:至于为什么 Main_SimpleStructData_t 似乎通过显示其成员来“工作”,答案仍然是它是未定义的行为,并且它可能会执行任何操作,包括“正确”的事情。在这种特殊情况下,根本原因几乎可以肯定:

  1. printf 尝试读取一个 unsigned int 参数(因为当您说您传递了一个 unsigned int< 时,它不知道您实际传递的内容)
  2. 小的 Main_SimpleStructData_t 恰好作为参数传递,其方式与 unsigned int 相同(在您的平台上),并且 printf 最终读取其成员的值。
  3. 较大的 Main_StructuredData_t 恰好以不同的方式作为参数传递(例如,在堆栈上而不是在寄存器中),并且 printf 读取一些随机值相反,因为 struct 不在 unsigned int 参数所在的位置。

关于c - 结构体/结构体值的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957425/

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