[英]How to make a function return a pointer to array struct
我正在使用C中的一個函數,它應該返回一個指向數組結構的指針。 結構是
struct corr{
char nome[128];
char cognome[128];
char password[10];
float importo;
};
typedef struct corr correntista;
返回指向此結構的指針的函數是
correntista *max_prelievo(FILE *fcorrentisti, FILE *fprelievi){
correntista *corr_max[2];
corr_max[0] = (correntista *)malloc(sizeof(correntista));
corr_max[1] = (correntista *)malloc(sizeof(correntista));
/*.........*/
return *corr_max;
}
在主程序中,我想以下列方式打印返回的值:
*c_max = max_prelievo(fc, fp);
printf("Correntista con max prelievi:\n");
printf("Nome: %s\n", c_max[0]->nome);
printf("Cognome: %s\n", c_max[0]->cognome);
printf("Max prelievo: %f\n\n", c_max[0]->importo);
printf("Correntista con max versamenti:\n");
printf("Nome: %s\n", c_max[1]->nome);
printf("Cognome: %s\n", c_max[1]->cognome);
printf("Max versamento: %f\n", c_max[1]->importo);
但只有第一個結構c_max[0]
具有預期值。 c_max[1]
有垃圾值。 我的節目應該改變什么?
有幾種解決方案,但它們都需要對功能的運行方式進行全面檢查。 也許最好的解決方案是考慮scanf
工作原理; 它不返回任何對象,而是僅對傳遞給它的參數指向的對象進行操作。 因此:
void max_prelievo(correntista *corr_max, FILE *fcorrentisti, FILE *fprelievi){
/* NOTE: You should make a habit of separating your allocation from this logic;
* it makes debugging and testing so much easier... */
corr_max[0] = (correntista) { .nome = "Michael",
.cognome = "Anderson",
.importo = 42.0 };
corr_max[1] = (correntista) { .nome = "Undefined",
.cognome = "Behaviour",
.importo = -1.0 };
/*.........*/
}
int main(void) {
correntistia c_max[2] = { 0 };
FILE *f1 = fopen(...), *f2 = fopen(...);
max_prelievo(c_max, f1, f2);
printf("Correntista con max prelievi:\n");
printf("Nome: %s\n", c_max[0].nome);
printf("Cognome: %s\n", c_max[0].cognome);
printf("Max prelievo: %f\n\n", c_max[0].importo);
printf("Correntista con max versamenti:\n");
printf("Nome: %s\n", c_max[1].nome);
printf("Cognome: %s\n", c_max[1].cognome);
printf("Max versamento: %f\n", c_max[1].importo);
}
什么scanf
不會返回是一個整數,表示成功。 也許,如果你將來要使用返回值,你可以使用類似的模式嗎? 看看光明的一面:這里沒有malloc
或free
,你沒有機會泄漏任何記憶; 代碼盡可能簡單。
或者,盡管看起來很可怕,如果你必須使用這樣的模式,那么對malloc
較少調用將很好地為你服務。 考慮這樣的事情:
correntista *max_prelievo(FILE *fcorrentisti, FILE *fprelievi) {
correntista *corr_max = malloc(2 * sizeof *corr_max);
corr_max[0] = (correntista) { .nome = "Michael",
.cognome = "Anderson",
.importo = 42.0 };
corr_max[1] = (correntista) { .nome = "Undefined",
.cognome = "Behaviour",
.importo = -1.0 };
/*.........*/
return corr_max;
}
main
入口點幾乎與我之前給出的例子相同......除了一件事: 別忘了free
那段記憶! :(
記住你擁有的是指針數組,所以當你退出函數時,數組超出了范圍。 為此目的指向指針,如下所示。
correntista **max_prelievo(FILE *fcorrentisti, FILE *fprelievi){
correntista **corr_max = malloc(sizeof(correntista *) * 2);
corr_max[0] = malloc(sizeof(correntista));
corr_max[1] = malloc(sizeof(correntista));
/*.........*/
return corr_max;
}
電話應該是
correntista **c_max = max_prelievo(fc, fp);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.