malloc () dan realloc () struktur
Bisakah kita mengalokasikan memori untuk struktur secara dinamis? Apakah ini prosedur yang benar untuk mendekati struktur yang dialokasikan secara dinamis? Tolong beritahu saya bagaimana malloc()dan realloc()strukturnya.
newnode adalah tipe struct List * tetapi ketika mulai mengindeks diubah menjadi struct List. Bagaimana konversi ini mungkin? Fungsi insert saya hanya menerima (Daftar struct *) Apakah saya salah di suatu tempat?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List {
char val[20];
};
void insert(struct List *);
int main(void) {
int i = 0;
int size = 1;
struct List *newnode = (struct List *)malloc(size * sizeof(struct List));
for (i = 0; i < 5; i++) {
if (size <= i) {
size = size + size;
newnode = (struct List *)realloc(newnode, size * sizeof(struct List));
}
scanf("%s", newnode[i].val);
insert(newnode[i]);
}
for (i = 0; i < 5; i++) {
printf("%s\n", newnode[i].val);
}
return 0;
}
void insert(struct List *node) {
printf("%s\n", node->val);
}
Jawaban
Kode berfungsi kecuali untuk 3 masalah:
Anda tidak menguji kegagalan alokasi memori. Keduanya
malloc()danrealloc()akan kembaliNULLjika memori tidak dapat dialokasikan: Anda akan mendapatkan perilaku tidak terdefinisi saat dereferensinewnodejika hal ini terjadi.untuk menangani kasus
realloc()kegagalan dengan baik, Anda harus menyimpan pointer yang dialokasikan kembali ke variabel lain sehingga Anda masih dapat mengakses array sebelumnya yang belum dialokasikan dan membebaskannya.scanf("%s", newnode[i].val);adalah kelemahan keamanan: Anda harus membatasi jumlah byte yang dapat disimpan ke array tujuan denganscanf("%19s", newnode[i].val);Anda tidak menguji nilai kembalian
scanf()untuk mendeteksi input yang tidak valid atau hilang.insert()tidak memasukkan apapun.
Berikut adalah versi modifikasi dengan penanganan kesalahan dan nama yang tidak terlalu membingungkan:
#include <stdio.h>
#include <stdlib.h>
struct Item {
char val[20];
};
//void insert(struct Item *);
int main(void) {
int i, j;
int size = 0;
struct Item *array = NULL;
for (i = 0; i < 5; i++) {
if (i >= size) {
int newsize = size ? 1 : size + size;
struct Item *newarray = realloc(array, sizeof(*array) * size);
if (newarray == NULL) {
perror("cannot reallocate the array");
break;
}
size = newsize;
array = newarray;
}
if (scanf("%19s", array[i].val) != 1) {
fprintf(stderr, "missing input\n");
break;
}
//insert(array[i]);
}
for (j = 0; j < i; i++) {
printf("%s\n", array[i].val);
}
free(array);
return 0;
}