1

我有一个原型函数:

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);

我在另一个函数中使用它,我基本上首先发送一个指向结构数据的指针,然后在这个函数内部,在这样的循环中调用“procedureForEachWave”函数:

procedureForEachWave(data->Barge, data->Settings, &data->waveList[i]);

这工作正常。但是,我还想做一个分析,我只使用一个波,这意味着列表只包含一个元素,因此我不需要调用第一个函数。我只想这样做:

procedureForEachWave(Barge, Settings, &data.waveList[0]);

但这不起作用。为什么?以及如何让它工作?为了澄清,数据现在被声明为变量,而不是指针,并且 Barge 和 Settings 已经是指针。waveList 是这样声明的:

data.waveList = (struct wave*) malloc(sizeof(struct wave));
4

2 回答 2

0

在不知道内部发生的任何事情的情况下procedureForEachWave,很难(如果不是不可能的话)说出问题所在。

但是,看起来data在有效的调用和无效的调用之间的使用方式有所不同。如果他们使用相同data的,调用应该是相同的(用 0 代替i)。如果它们不同,请提供此 other 的定义data

于 2012-04-24T13:24:06.280 回答
0

考虑代码片段:

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);

请注意,如果通过指针传递的大小&value大于 1,您将陷入未定义的行为。其他两个调用都是完全合法的:但是,第三个调用有效地将数组的三行子集传递给函数。

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

void wave_function(struct wave *ptr)
{
}

void wave_function(struct wave ptr[])
{
}

这些是等效的声明(但仅在参数列表中)。你甚至可以在数组表示法中包含一个大小,尽管这不会向函数传达任何信息,除非你用 C99 语法修饰它:

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

这种表示法意味着调用者必须保证传递给这个版本的数组中至少有 4 个元素wave_function

于 2012-04-24T13:59:27.590 回答