yapıların malloc () ve realloc ()
Yapılar için dinamik olarak bellek ayırabilir miyiz? Bu, dinamik olarak tahsis edilmiş yapılara yaklaşmak için doğru bir prosedür müdür? Lütfen bana nasıl yapılacağını malloc()ve realloc()bir yapıyı söyle .
newnode struct List * türündedir, ancak indekslemeye başladığında struct List'e dönüşür.Bu dönüşüm nasıl mümkün olabilir? Ekleme işlevim yalnızca kabul eder (struct List *) Bir yerde yanılıyor muyum?
#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);
}
Yanıtlar
Kod 3 problem dışında çalışır:
Bellek ayırma hatasını test etmezsiniz. Her ikisi de
malloc()ve eğer bellek ayrılamazsarealloc()geri dönecektirNULL:newnodeBöyle bir durumda başvuruyu iptal ederken tanımsız davranışla karşılaşırsınız .realloc()Başarısızlık durumunu incelikle ele almak için , yeniden tahsis edilen işaretçiyi farklı bir değişkene depolamalısınız, böylece ayrılmamış önceki diziye hala erişebilir ve onu serbest bırakabilirsiniz.scanf("%s", newnode[i].val);bir güvenlik açığıdır: hedef dizide depolanabilecek bayt sayısını sınırlamalısınız.scanf("%19s", newnode[i].val);scanf()geçersiz veya eksik girişi tespit etmek için dönüş değerini test etmezsiniz.insert()gelmez eklemek şey.
İşte hata işleme ve daha az kafa karıştırıcı adlar içeren değiştirilmiş bir sürüm:
#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;
}