通过C中的函数参数访问struct成员

时间:2017-08-09 14:00:19

标签: c struct

int f(){
    struct NUMBER {     
        int A;
        int B;     
    };

    struct NUMBER *num = malloc(sizeof(struct NUMBER));

    num->A = 1;
    num->B = 2;

    int x = num->B;

    return x;
}


int main(){
    int z = f();
    printf("%d\n", z);   
}

显然,。/ a .out会显示2

我的问题:我可以通过函数的参数访问struct成员吗?即f(A)返回1f(B)返回2。非常感谢。

4 个答案:

答案 0 :(得分:2)

一点也不优雅,但我认为它向您展示了您需要做什么/知道什么。

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

struct NUMBER {
    int A;
    int B;
};

struct NUMBER extNumber = {1, 2};

int f(int offset) {

    int iRet = -1;

    if (offset == offsetof(struct NUMBER, A)) {
        iRet = extNumber.A;
    } else if (offset == offsetof(struct NUMBER, B)) {
        iRet = extNumber.B;
    }

    return iRet;
}

int main (int argc, char **argv) {

    struct NUMBER number;

    int iVal;

    iVal = f(offsetof(struct NUMBER, A));
    printf ("A : %d\n", iVal);
    iVal = f(offsetof(struct NUMBER, B));
    printf ("B : %d\n", iVal);

}

答案 1 :(得分:2)

  

我可以通过函数参数访问struct成员吗?

我认为你也假设在函数外部看不到struct。现在,如果编写main的人没有对函数的可见性(比如它是库的一部分),那么答案是否定的。

否则如果main的作者可以看到函数的内部,那么:有人能想出一种通过函数参数访问函数内部结构成员的奇特方法吗?那个让我们想想f(A)是什么意思?这里,A是结构成员的名称,所以你的意思是将char A传递给f并将其转换为f中的struct成员[例如result = *(int *)num+(inchar-'A')其中inchar是char类型函数的输入参数。同样,人们可以想象其他方式。

答案 2 :(得分:1)

据我了解你的问题,最干净,最“类似C”的解决方案是将一个指向你的struct的指针传递给f(),在那里填充它:

typedef struct _NUMBER
    {
    int A;
    int B;
    }
NUMBER;

void f (NUMBER* pvNumber)
    {
    pvNumber->A = 1;
    pvNumber->B = 2;
    return;
    }

这样称呼:

int main ()
    {
    NUMBER vNumber;
    int    z;

    f (&vNumber);
    z = vNumber.A; // or vNumber.B
    return 0;
    }

所以你不要在f()中选择所需的成员,而是在它之外。

答案 3 :(得分:0)

是。你需要定义一些方法来访问所需的成员,这通常用常量或枚举来完成。另外,在使用它之前,你应该总是检查malloc()返回的指针。

#define  GET_A (0)
#define  GET_B (1)

int f(int selector){

    struct NUMBER {     
        int A;
        int B;     
    };

    int result;
    struct NUMBER *num = malloc(sizeof(struct NUMBER));
    if (!num)
        return -1;  // or some other error code...    

    num -> A = 1;
    num -> B = 2;

    switch(selector)
    {
    case GET_A: result = num->A; break;
    case GET_B: result = num->B; break;
    // etc... if you have more members in your struct.
    default:    result = -1; break;      // some error code.
    }

    free(num)
    return result;
}

int main(){

    int z = f(GET_B);
    printf(  "%d\n" , f(GET_B));
}