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)
返回1
,f(B)
返回2
。非常感谢。
答案 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));
}