通过相同结构的另一个成员访问结构的成员

时间:2014-11-05 20:03:14

标签: c pointers memory-management data-structures

让我们假装我们有以下代码:

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和运行时出现并发症。 用一个词来说,它不起作用。我做错了什么?

2 个答案:

答案 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;
}