calloc dan realloc
Memori dinolkan dan diubah saiz
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.
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
- malloc dan free
- calloc dan realloc
- Kebocoran Memori
- Penuding Tergantung