malloc () และ realloc () ของโครงสร้าง
เราสามารถจัดสรรหน่วยความจำสำหรับโครงสร้างแบบไดนามิกได้หรือไม่? นี่เป็นขั้นตอนที่ถูกต้องในการเข้าถึงโครงสร้างที่จัดสรรแบบไดนามิกหรือไม่? กรุณาบอกฉันวิธีการmalloc()และrealloc()โครงสร้าง
newnode เป็นประเภท struct List * แต่เมื่อเริ่มสร้างดัชนีจะแปลงเป็นรายการโครงสร้างการแปลงนี้เป็นไปได้อย่างไรฟังก์ชันแทรกของฉันยอมรับเฉพาะ (รายการโครงสร้าง *) ฉันผิดตรงไหนหรือเปล่า
#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);
}
คำตอบ
รหัสใช้งานได้ยกเว้น 3 ปัญหา:
คุณไม่ได้ทดสอบความล้มเหลวในการจัดสรรหน่วยความจำ ทั้งสองอย่าง
malloc()และrealloc()จะกลับมาNULLหากไม่สามารถจัดสรรหน่วยความจำได้: คุณจะได้รับพฤติกรรมที่ไม่ได้กำหนดเมื่อการอ้างอิงnewnodeควรเกิดขึ้นเพื่อจัดการกับกรณีของ
realloc()ความล้มเหลวอย่างสง่างามคุณควรจัดเก็บตัวชี้ที่จัดสรรใหม่ไปยังตัวแปรอื่นเพื่อให้คุณยังคงสามารถเข้าถึงอาร์เรย์ก่อนหน้านี้ที่ยังไม่ได้ถูกยกเลิกการจัดสรรและปลดปล่อยมันได้scanf("%s", newnode[i].val);เป็นข้อบกพร่องด้านความปลอดภัย: คุณควร จำกัด จำนวนไบต์ที่สามารถจัดเก็บไปยังอาร์เรย์ปลายทางด้วยscanf("%19s", newnode[i].val);คุณไม่ได้ทดสอบค่าที่ส่งคืน
scanf()เพื่อตรวจหาอินพุตที่ไม่ถูกต้องหรือขาดหายไปinsert()ไม่แทรกอะไรเลย
นี่คือเวอร์ชันที่แก้ไขซึ่งมีการจัดการข้อผิดพลาดและชื่อที่สับสนน้อยกว่า:
#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;
}