我有一個程式,我想將一個新元素添加到結構陣列中。在我的 add 函式中它似乎有效,但是當我嘗試在 main 函式中使用它時,它似乎與最初回傳的不同。
我有我main.c這樣的:
int main(void) {
Recept * receptek;
int valasztas;
int *hossz = 0; //A receptek száma.
receptek = betolt("receptek.txt", &hossz);
if (receptek != NULL) {
menu();
printf("Valasztott opcio: ");
while(scanf("%d", &valasztas) == 1) {
if(valasztas == 1) {
Recept * uj = recept_felvesz(receptek, hossz);
printf("%dTH VALUE HERE: %s\n", (int)hossz, uj[(int)hossz].nev);
if(uj != NULL) {
printf("Recept sikeresen felveve.\n\n");
hossz = (int)hossz 1;
} else {
printf("Nem sikerult a receptet felvenni.\n\n");
}
} else if(valasztas == 2) {
kiir(receptek, (int)hossz);
} else if(valasztas == 6) {
break;
} else {
system("cls");
menu();
printf("Ervenytelen opcio.\n\n");
}
printf("Valasztott opcio: ");
}
} else {
printf("Nem sikerult betolteni a tarolofajlt!\n");
}
return 0;
}
我將添加函式 ( recept_felvesz)存盤在不同的.h檔案中。
Recept* recept_felvesz(Recept* receptek, int* hossz) {
printf("Hossz 1: %d", (int)hossz);
setbuf(stdin, NULL);
char bekert_nev[30];
char bekert_ot[300];
printf("Add meg a recept nevet: ");
if(fgets(bekert_nev, 30, stdin))
bekert_nev[strcspn(bekert_nev, "\n")] = '\0'; //A \n karaktert kicseréli \0-ra
printf("Add meg a recept osszetevoit: ");
if(fgets(bekert_ot, 300, stdin))
bekert_ot[strcspn(bekert_ot, "\n")] = '\0'; //A \n karaktert kicseréli \0-ra.
system("cls");
menu();
Recept uj = {(int)hossz, bekert_nev, bekert_ot};
receptek = (Recept*) realloc(receptek, ((int)hossz 1) * sizeof(Recept));
receptek[(int)hossz] = uj;
if (receptek == NULL) return NULL;
FILE *file = fopen("receptek.txt", "a");
if (file == NULL) return NULL;
fprintf(file, "\n%s;%s;", bekert_nev, bekert_ot);
fclose(file);
printf("\n%dTH VALUE HERE: %s\n", (int)hossz, receptek[(int)hossz].nev);
return receptek;
}
這是目前錯誤的輸出:
15TH VALUE HERE: 32423
15TH VALUE HERE: ?
Recept sikeresen felveve.
為什么實際回傳值 ( 32423) 與main函式 ( ?) 中使用的不同?
編輯:結構Recept如下所示:
typedef struct Recept {
int azonosito;
char *nev;
char *osszetevok;
} Recept;
uj5u.com熱心網友回復:
在此代碼記憶體中,區域變數bekert_nev并bekert_ot在定義它們的范圍(函式recept_felvesz)之外使用。它們在堆疊上分配,因此在退出函式后,recept_felvesz它們的記憶體可以被其他任何人使用,因為它被認為是未使用的。例如printf可以在這個記憶體塊中存盤它的內部變數。
解決此問題的一種方法是使用函式在全域記憶體中分配bekert_nev和分配:bekert_otmalloc
char* bekert_nev = malloc(30);
char* bekert_ot = malloc(300);
free當您要銷毀主receptek陣列時,請記住使用函式釋放此記憶體:
Recept* rec = receptek;
for( int i = 0; i < hossz; i) {
free( rec->nev );
free( rec->osszetevok );
rec ;
}
或者,您可以將此陣列放入Recept結構中并直接寫入它們
typedef struct Recept {
int azonosito;
char nev[30];
char osszetevok[300];
} Recept;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367405.html
