Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การจัดสรรหน่วยความจำแบบไดนามิกให้ Pointer to Structure ในภาษา C

Pointer to Structure

Pointer to structure คือ pointer ที่เก็บที่อยู่ของ structure ทั้งหมด ใช้สร้างโครงสร้างข้อมูลซับซ้อนเช่น linked lists, trees, graphs

การประกาศ

struct tagname *ptr;

ตัวอย่าง: struct student *s;

การเข้าถึงสมาชิก

ใช้ arrow operator (->)

ptr->membername;

ตัวอย่าง: s->sno, s->sname, s->marks;

ฟังก์ชันจัดสรรหน่วยความจำไดนามิก

  • malloc(size) - จัดสรรหน่วยความจำตามไบต์ที่ระบุ
  • calloc(n, size) - จัดสรรบล็อกต่อเนื่อง n บล็อก ขนาด size ไบต์ และตั้งค่าเป็น 0
  • realloc(ptr, new_size) - ปรับขนาดหน่วยความจำที่จัดสรรไว้
  • free(ptr) - คืนหน่วยความจำ

ตัวอย่างโปรแกรมที่ 1: จัดสรรหน่วยความจำสำหรับ Array of Structures แบบไดนามิก

#include <stdio.h>
#include <stdlib.h>
struct person {
    int age;
    float weight;
    char name[30];
};
int main() {
    struct person *ptr;
    int i, n;
    printf("ป้อนจำนวนคน: ");
    scanf("%d", &n);
    // จัดสรรหน่วยความจำสำหรับ n โครงสร้าง person
    ptr = (struct person*) malloc(n * sizeof(struct person));
    if (ptr == NULL) {
        printf("จัดสรรหน่วยความจำล้มเหลว\\n");
        return 1;
    }
    for (i = 0; i < n; ++i) {
        printf("ป้อนชื่อและอายุคนที่ %d: ", i+1);
        scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);
    }
    printf("\\nข้อมูลที่ป้อน:\\n");
    for (i = 0; i < n; ++i) {
        printf("ชื่อ: %s\\tอายุ: %d\\n", (ptr+i)->name, (ptr+i)->age);
    }
    free(ptr); // คืนหน่วยความจำ
    return 0;
}

ผลลัพธ์ตัวอย่าง

ป้อนจำนวนคน: 1
ป้อนชื่อและอายุคนที่ 1: bhanu 24
ข้อมูลที่ป้อน:
ชื่อ: bhanu   อายุ: 24

ตัวอย่างโปรแกรมที่ 2: ใช้ Pointer กับ Array of Structures (ไม่ใช่ malloc)

#include <stdio.h>
struct Manager {
    char Name[15];
    int Age;
    char Gender;
    float Level;
    char Role[50];
    char temp;
} m[20];

int main() {
    int i;
    struct Manager *p = &m[0]; // pointer ชี้ตัวแรกของ array
    for (i = 0; i < 2; i++) {
        printf("ป้อนชื่อผู้จัดการ %d: ", i+1);
        gets(p->Name); // ควรใช้ fgets แทน
        printf("ป้อนอายุ %d: ", i+1);
        scanf("%d", &p->Age);
        scanf("%c", &p->temp); // clear buffer
        printf("ป้อนเพศ %d: ", i+1);
        scanf("%c", &p->Gender);
        printf("ป้อนระดับ %d: ", i+1);
        scanf("%f", &p->Level);
        scanf("%c", &p->temp); // clear buffer
        printf("ป้อนบทบาท %d: ", i+1);
        gets(p->Role);
        p++; // ขยับไป element ถัดไป
    }
    p = &m[0]; // reset pointer
    for (i = 0; i < 2; i++) {
        printf("ผู้จัดการ %d: %s, อายุ %d, เพศ %c, ระดับ %.0f, บทบาท %s\\n",
               i+1, p->Name, p->Age, p->Gender, p->Level, p->Role);
        p++;
    }
    return 0;
}

คำอธิบายสำคัญ

  • การใช้ (ptr+i)->member เทียบเท่ากับ ptr[i].member
  • ต้องตรวจสอบค่า NULL หลัง malloc/calloc/realloc เสมอ
  • ต้อง free() หน่วยความจำเมื่อไม่ใช้แล้ว เพื่อป้องกัน memory leak