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

C 通过同一结构的另一个成员访问结构的一个成员,c,pointers,memory-management,data-structures,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(aSt

假设我们有以下代码:

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.a2
内存地址并取消对它的引用来访问
aStruct.a1
的值,但是这样做会导致u/b和运行时的复杂性。
一句话,它不起作用。我做错了什么?

有两个不同的问题。首先,传递字段的值,而不是其地址

其次,假设您有一个struct字段的地址,您可以借助宏获得指向struct本身的指针:


有多个错误:

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;
}
typedef结构
{
int a1;
int a2;
}结构;

int prev(a_struct a_struct)//不,修复了
prev
参数,这是我的错误。我不只是复制/粘贴我所做的事情。。想要提供一个简单的示例。@user1952500
-sizeof(int)
看起来不正确。不能保证布局是连续的。@AlexD,也不能保证像struct这样的POD结构吗?@AlexD,链接指向非POD结构。例如,来自wiki()的链接说:布局构成POD对象的字节是连续的[§1.8,^5]。“POD结构…类型如果具有相同数量的成员,则它们是布局兼容的,并且相应的成员(按顺序)具有布局兼容的类型”[§9.2,^14]。吊舱联盟。。。如果类型具有相同数量的成员,则它们是布局兼容的,并且相应的成员(以任何顺序)具有布局兼容的类型“[§9.2,^15]。类不是POD结构。@user1952500我不是指类。我指的是链接答案中的
struct some_object
。它可能有(尽管不一定有)在
char c
之后填充。在我们的例子中,填充的可能性要小得多,但据我所知,这仍然不能保证。
size\u t offset=(int)offsetof(a_struct,a2)
我不能允许这样做,不管是什么。我需要手动生成宏。@coreration只要看看编译器是如何实现
offsetof
宏的。不幸的是,它不是。我是在封闭的平台SDL窗口运行时编码的。我不能包含额外的库,语言版本是C89。@coreration尝试类似这样的方法:
#定义我的偏移量(s,m)(size_t)(char*)(&((s*)0)->m))
它甚至不会编译。它不可靠,但是如果调用
prev(&aStruct->a2)
并编写
intprev(int*a2){int*p1=a2-1;返回*p1;}
它应该可以工作。如果给
prev()
一个非指针参数,您就无能为力了。
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;
}