C Academy · Pelajaran

calloc dan realloc

Memori dinolkan dan diubah saiz

Pelajaran 2 daripada 413 langkah

calloc dan realloc ialah pelajaran C Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Selain malloc

Selain malloc, pustaka piawai menawarkan calloc untuk memori yang dinolkan dan realloc untuk mengubah saiz blok sedia ada.

Kedua-duanya berada dalam <stdlib.h>.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

calloc Menolkan Memori

calloc(count, size) memperuntukkan ruang untuk count elemen dengan size bait dan menetapkan setiap bait kepada sifar.

Ini berguna apabila anda memerlukan keadaan permulaan yang bersih.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

calloc Mempunyai Dua Argumen

Tidak seperti malloc, calloc menerima bilangan elemen dan saiz setiap elemen secara berasingan.

Ia juga mengelakkan limpahan apabila bilangan elemen didarab dengan saiz.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

malloc berbanding calloc

Gunakan malloc apabila anda akan menulis ganti setiap bait, dan gunakan calloc apabila anda bergantung pada memori yang bermula dengan nilai sifar.

calloc memerlukan sedikit kos tambahan kerana proses menolkan memori.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

Membesarkan dengan realloc

realloc(ptr, newsize) mengubah saiz blok sambil mengekalkan kandungan sedia ada sehingga saiz yang lebih kecil antara saiz lama dan baharu.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

realloc Mungkin Memindahkan Blok

realloc mungkin mengembalikan alamat yang berbeza jika ia memindahkan blok untuk mencari ruang.

Sentiasa tetapkan hasilnya semula dan jangan terus menggunakan penuding lama.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

Corak realloc yang Selamat

Jika realloc gagal, ia mengembalikan NULL tetapi mengekalkan blok asal.

Tetapkan hasilnya kepada pemboleh ubah sementara terlebih dahulu supaya anda tidak kehilangan penuding lama apabila berlaku kegagalan.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

Mengecilkan Blok

realloc juga boleh mengecilkan blok. Elemen di bahagian hadapan dikekalkan; selebihnya dibebaskan.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

Penimbal yang Membesar

Corak biasa menggandakan kapasiti apabila tatasusunan penuh, lalu menyebarkan kos pembesaran.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

realloc dengan NULL

realloc(NULL, size) berfungsi tepat seperti malloc(size).

Ini membolehkan rutin pembesaran mengendalikan peruntukan pertama dengan cara yang seragam.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

Menggabungkan Kesemuanya

Anda boleh bermula dengan calloc untuk mendapatkan penimbal yang dinolkan dan kemudian membesarkannya dengan realloc. Bait baharu selepas pembesaran tidak dinolkan.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

Semakan Pantas

Uji pengetahuan anda tentang calloc dan realloc.

Imbas Kembali

Anda telah mempelajari dua alat peruntukan tambahan:

  • calloc(count, size) memperuntukkan memori yang dinolkan dan mengelakkan limpahan pendaraban.
  • realloc(ptr, newsize) mengubah saiz blok dan mungkin memindahkannya.
  • Sentiasa tetapkan hasil realloc kepada pemboleh ubah sementara untuk mengelakkan kebocoran apabila berlaku kegagalan.
  • realloc(NULL, size) berfungsi seperti malloc.
Percuma untuk bermula

Pelajari C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “calloc dan realloc” percuma?

Ya — teks penuh “calloc dan realloc” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus C Academy, tingkat taraf kepada CoddyKit PRO. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “calloc dan realloc”?

Memori dinolkan dan diubah saiz Anda berlatih C Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “calloc dan realloc” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. malloc dan free
  2. calloc dan realloc
  3. Kebocoran Memori
  4. Penuding Tergantung
← Kembali ke C Academy