【发布时间】:2015-07-26 01:24:44
【问题描述】:
我在玩结构并尝试使用偏移量获取它们的值,这是我的代码
#include <stdio.h>
#include <stddef.h>
typedef struct abcd{
int a,b;
double c,d;
}abcd;
int main()
{
abcd teste = {.a = 3, .b = 5, .c = 7, .d = 9};
printf("value of a: %d //value of b: %d\n",*( (char*) &teste), *((char*) &teste + offsetof(abcd, b)) );
return 0;
}
输出:value of a: 3 //value of b: 5
一切正常,但是当我将 printf 更改为
printf("value of a: %d value of b: %d\n", *( &teste), *((char*) &teste + offsetof(abcd, b)) );
//No casting to (char*) in value of a
我得到输出:value of a: 5 value of b: 1360854088
为什么会这样?
【问题讨论】:
-
您的第二个
printf实际上是为%d格式说明符提供完整的结构(*(&teste))。这将使格式字符串中后续说明符的后续值的堆栈位置不对齐。 -
类型转换在 C 编程中有着悠久而受人尊敬的传统,并且对于正确使用返回
void *类型的malloc()之类的东西是必要的。我不确定 GRC 发生了什么。 -
@larsks 在 C 中你不应该转换
void *,尤其是malloc。void *可以分配给任何非函数指针类型而无需强制转换。然而,C++ 是另一回事。 -
@GRC 在 C 中进行类型转换时,究竟违反了什么标准?
-
@GRC 讨论的不是一般的选角,而是选角
void *。在 OP 的示例中,情况并非如此。