让我们假装我们有以下代码:
typedef struct
{
int a1;
int a2;
} a_struct;
int prev (int a2)
{
int* p = &A_STRUCT-4;
return *p;
}
int main(void)
{
a_struct aStruct[] = {5, 10}; // Array-type initializing
printf("aStruct.a1 = %i", prev(aStruct->a2));
return 1;
}
我试图通过访问aStruct.a1
内存地址并取消引用它来访问aStruct.a2
的值,但是按照这种方式,它会导致u / b和运行时出现并发症。
用一个词来说,它不起作用。我做错了什么?
答案 0 :(得分:2)
有两个不同的问题。首先,您传递字段的值,而不是地址。
其次,假设你有一个struct字段的地址,你可以在offsetof
宏的帮助下得到一个指向struct本身的指针:
int prev(int* pa2)
{
size_t offset = offsetof(a_struct, a2);
a_struct* p = (a_struct*)((char*)pa2 - offset);
return p->a1;
}
....
printf("aStruct.a1 = %i\n", prev(&aStruct->a2));
答案 1 :(得分:0)
有多个错误:
typedef struct
{
int a1;
int a2;
} a_struct;
int prev (a_struct A_STRUCT) // <== This should be void* A_STRUCT since you are receiving an address.
{
int* p = &A_STRUCT-4; // <== This should be (char *)A_STRUCT - sizeof(int). Read about pointer arithmetic.
return *p;
}
int main(void)
{
a_struct aStruct[] = {5, 10}; // Array-type initializing
printf("aStruct.a1 = %i", prev(aStruct->a2)); // <== This should be prev(&aStruct->a2) since you are passing the address.
return 1;
}