คำถามของฉันง่าย ๆ ... ฉันมีการประกาศโครงสร้างดังต่อไปนี้:
struct Address {
int id;
int set;
char *name;
char *email;
};
struct Database {
struct Address rows[512];
};
struct Connection {
FILE *file;
struct Database *db;
};
เมื่อชัดเจนแล้ว ฉันจึงเริ่มต้น "ฐานข้อมูล" ของฉันภายใน "การเชื่อมต่อ" ด้วยที่อยู่จำลอง ฉันใช้ฐานข้อมูลนี้ในภายหลังและบันทึกลงในไฟล์ภายในโครงสร้าง "การเชื่อมต่อ" ของฉันด้วย:
void Database_write(struct Connection *conn){
rewind(conn->file);
int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
if(rc != 1){
die("Failed to write database.\n",conn);
}
rc = fflush(conn->file);
if(rc == -1){
die("Cannot flush database.\n",conn);
}
ทุกอย่างใช้งานได้ดีเมื่อฉันมีจำนวนแถวที่กำหนดไว้ล่วงหน้าภายในโครงสร้าง "ฐานข้อมูล" สำหรับที่อยู่ของฉัน เช่น 512 แต่ถ้าฉันต้องการสร้างจำนวนแถวแบบไดนามิกล่ะ เหมือนกับที่พารามิเตอร์ส่งผ่านไปยังฟังก์ชันเหรอ? ฉันได้ลองใช้สิ่งต่อไปนี้...
struct Database {
struct Address *rows;
};
และจัดสรรพื้นที่ให้กับพอยน์เตอร์นี้ด้วย:
conn->db->rows = (struct Address*) malloc(sizeof(struct Address)*max_rows);
โดยที่ max_rows เป็นพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน...แต่ตอนนี้ปัญหาก็คือเมื่อฉันลองบันทึกสิ่งนี้ลงในไฟล์ภายในโครงสร้าง "การเชื่อมต่อ" ของฉัน ฉันแค่บันทึกตัวชี้ "struct Address *rows;" และไม่ใช่ข้อมูลที่จัดสรรพื้นที่ไว้ มีข้อเสนอแนะเกี่ยวกับวิธีการบันทึกพื้นที่ที่จัดสรรนี้หรือมีอาร์เรย์ที่กำหนดไว้ล่วงหน้าภายในโครงสร้างแล้วขยายแบบไดนามิกหรือไม่
ขอบคุณล่วงหน้า!
malloc()
ถึงstruct Address *
หรือไม่? หรือคุณเพียงทำเพราะคุณเห็นมันที่อื่น? ฉันถามสิ่งนี้เพราะมันจะแตกต่างออกไปมากถ้าคุณต้องแคสต์ มันจะเป็นภาษาที่แตกต่างออกไปโดยสิ้นเชิง นอกจากนี้conn->db->rows
อาจยกเลิกการอ้างอิงตัวชี้NULL
หากคุณไม่ระวัง แล้วdie()
คืออะไร มันทำให้โค้ดดูเหมือน PHP และมันคือ PHP ดังนั้นมันคือ PHP - person Iharob Al Asimi   schedule 09.05.2017name
และemail
เป็นตัวชี้ด้วย คุณต้องเขียนเฉพาะข้อความลงในไฟล์หรือทำสิ่งที่ ความคิดเห็นนี้ แนะนำ - person Iharob Al Asimi   schedule 09.05.2017