簡體   English   中英

將具有結構列表的結構傳遞給功能

[英]Passing structure with list of structures to function

我有一個原型函數:

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

這很好。 但是,我也想做一個僅使用一個wave的分析,這意味着列表僅包含一個元素,因此不需要調用第一個函數。 我只想這樣做:

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

但這不起作用。 為什么? 以及如何使它工作? 為了澄清起見,現在將數據聲明為變量,而不是指針,並且“插入”和“設置”已經是指針。 waveList的聲明如下:

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

如果不知道procedureForEachWave內部發生的一切,就很難(即使不是不可能)知道問題出在哪里。

但是,看起來好像在有效的調用和無效的調用之間使用data方式有所不同。 如果他們使用相同的data ,則調用應該是相同的(用0代替i )。 如果它們不同,請提供其他data的定義。

考慮一下代碼片段:

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])
{
}

此表示法意味着調用者必須保證傳遞給此wave_function版本的數組中至少有4個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM