结构体参数中的函数指针?

3

foo是一个包含5个标量变量(A, B, C, D, F)和一个数组(E)的结构体。在这个上下文中,令我困惑的是f[0]f[1]f[2]是什么以及这里发生了什么。

int     
bar(struct foo *f)
{
    f[1].C = f[0].B > f[2].C;
    f[0].E[-1] = f[0].D;
    f[0].A = f[1].C;
}

f[0]f[1]f[2]是具有成员变量的单独结构体吗?可以有人解释一下吗?谢谢。


1
分段错误? :) - someuser
是的。f 是指向 struct foo 数组的第一个元素的指针。当使用数组下标(例如 [1])进行寻址时,编译器会计算出元素的地址并对其进行解引用(在这个例子中为 *(f + 1))。 - rslemos
@someuser,不一定。 - rslemos
1
在我15年以上使用C语言编程的经历中,我从未尝试过对数组中的负数元素进行解引用。这很奇怪。 - rslemos
1
哈哈,我刚刚注意到负索引rslemos。有趣的是,我很确定编译器不会有问题。我从未尝试过,现在我有冲动去试试看。 - James H
显示剩余7条评论
4个回答

2

f[0]f[1]f[2]是具有成员变量的单独结构体吗?

是的。 f是指向struct foo实例数组的指针,f[0]是该数组的第一个成员,f[1]是第二个成员,以此类推。您可以像这样调用它:

struct foo fArray[3];
// ... Initialize fArray[0], fArray[1], fArray[2] etc. ...
bar(fArray);

2
你正在做的是,将一个指向struct foo数组的引用(指针)传递给函数bar
你必须在某个地方有类似以下的代码:
struct foo  myFoos[10]; // an array with 10 elements of struct foo
struct foo *mallocedFoos;
// here goes some code to initialize the elements of the array
bar(&myFoos[0]);          // pass a reference to (address of/pointer to) the array

// or something like this is happening
mallocedFoos = malloc(sizeof(struct foo) * 10);
// here goes some code to initialize allocated memory
bar(mallocedFoos);        // pass the 'struct foo *' to the function

为了更好地理解这个概念,请查看this的示例。

2

是的,在这个上下文中,f[0]f[1]等都是类型为struct foo的数组元素。

对我来说更有趣的是这一行:

f[0].E[-1] = f[0].D;

我之前不知道负数索引是允许的,但是这个问题解释了数组索引只是指针运算,所以它其实是在用一种难懂的方式表达:

f[0].D = f[0].D;

据我所知,这基本上是没有用的。

还有一个有趣的事情:

f[0].C = f[0].B > f[2].C;

这将把f [0] .C 设置为布尔值,通常不会使用>运算符进行比较,因此可能为不同的函数使用不同的C成员。
我认为您的困惑是合理的,考虑到这个函数的奇怪性质。

谢谢(还有其他回答的人)。该函数是关于汇编符号的章节复习问题的一部分,实际上我认为完全理解该函数并不是回答问题的必要条件,但我想确保我理解这里发生了什么。感谢大家的回答! - user3822785
不客气,欢迎来到SO!这是我见过的最好的第一篇帖子之一。 - Austin Mullins
2
如果E是一个数组,那么不允许使用E[-1],因为这会尝试访问E的边界之外,导致未定义的行为。(最近版本的gcc -O3可能会在看到此代码时终止整个函数)。 - M.M
我刚刚在 Ubuntu 13.10 上使用 -O3 命令,用 gcc 4.8.1 进行了尝试,结果成功了。 - Austin Mullins
我认为关键在于数组是结构体的一部分,而不是第一部分,因此它背后有一个已知的内存分配。我不知道。除非它们发布在SO上,否则我从未阅读过标准。 - Austin Mullins

1
在这种情况下,f 是一个结构体数组,类似于
struct node = { int A; //A到D和F都是标量变量 int B; int C; int D; int E[10]; //E是整数数组 int F; } struct node f[10]; //f是结构体数组 如需更多详细信息,您还可以参考如何在C中创建结构体数组?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接