C 将结构和结构列表传递给函数

C 将结构和结构列表传递给函数,c,C,我有一个原型功能: void procedureForEachWave(struct barge *Barge, struct settings *Settings, struct wave *Wave) 在另一个函数中,我有一个名为threadData的另一个结构,我使用它向在多个线程上运行的函数发送信息,该结构的一个元素是struct wave的列表,因此该代码的简短版本如下: struct threadData data; data.waveList = (struct wave*) m

我有一个原型功能:

void procedureForEachWave(struct barge *Barge, struct settings *Settings, struct wave *Wave)
在另一个函数中,我有一个名为threadData的另一个结构,我使用它向在多个线程上运行的函数发送信息,该结构的一个元素是struct wave的列表,因此该代码的简短版本如下:

struct threadData data;
data.waveList = (struct wave*) malloc(sizeof(struct wave)*nrOfWaves);
我在另一个函数中使用了这个函数,我基本上首先发送一个指向结构数据的指针,然后在这个函数中,procedureReach函数在如下循环中被调用:

procedureForEachWave(data->Barge, data->Settings, &data->waveList[i]);
data.waveList = (struct wave*) malloc(sizeof(struct wave));
这个很好用。然而,我还想做一个分析,其中我只使用一个wave,这意味着列表只包含一个元素,因此我不需要调用第一个函数。我只想这样做:

procedureForEachWave(Barge, Settings, &data.waveList[0]);
但这是行不通的。为什么?我怎样才能让它工作呢?为了澄清这一点,数据现在声明为变量,而不是指针,并且参数和设置已经是指针了。waveList的声明如下:

procedureForEachWave(data->Barge, data->Settings, &data->waveList[i]);
data.waveList = (struct wave*) malloc(sizeof(struct wave));

如果不知道程序REACHWAVE内部发生了什么,很难甚至不可能说出问题所在


然而,看起来数据的使用在有效和无效的调用之间是不同的。如果它们使用相同的数据,则调用应该是相同的,用0代替i。如果它们不同,请提供其他数据的定义。

考虑代码片段:

extern void wave_function(struct wave *);
struct wave value     =   { ... };
struct wave array[10] = { { ... } };

wave_function(&value);
wave_function(array);
wave_function(&array[5]);
被调用函数无法从给定的指针判断它是传递给单个值的指针还是传递给值数组的指针。调用函数和被调用函数必须就指针的使用方式达成一致,也许可以将数组中的元素数作为单独的参数包括在内:

extern void alt_wave_function(struct wave *, size_t);

alt_wave_function(&value, 1);
alt_wave_function(array, 10);
alt_wave_function(&array[5], 3);
请注意,如果指针和值传递的大小大于1,您将进入未定义行为。其他两个调用都是完全合法的:不过,第三个调用实际上是将数组的三行子集传递给函数

因此,在函数内部,任何指针参数都可以被视为指向单个值的指针,或是指向值数组中第一项的指针。两者都是正确的。事实上,你甚至可以写:

void wave_function(struct wave *ptr)
{
}

void wave_function(struct wave ptr[])
{
}
这些是等价的声明,但仅在参数列表中。您甚至可以在数组表示法中包含一个大小,但这不会向函数传递任何信息,除非您使用C99语法对其进行修饰:

void wave_function(struct wave array[static 4])
{
}

此表示法意味着调用方必须保证传递给此版本的wave_函数的数组中至少有4个元素。

什么是不工作?您是否遇到编译错误或运行时错误,或者它是否给您带来了预期之外的运行时结果?如果编译器/链接器符合要求,请发布准确的错误消息。即使多次读取,我也无法理解这一点。请考虑在简单的语句中重新整理你的QN不工作-你的意思是不编译或不运行,因为你在运行时执行?是的:问题是,当我在XCODE中运行程序时,我得到了Excel BADYAccess消息。当函数尝试访问wave结构中的元素时会发生这种情况,该元素应来自&data.waveList[0]。