C Academy · Pelajaran

memcpy dan memset

Fungsi memori mentah.

Pelajaran 4 dari 413 langkah

memcpy dan memset adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Fungsi memori mentah

Tidak seperti fungsi string, memcpy dan memset bekerja pada byte mentah dan mengabaikan terminator null.

Keduanya dideklarasikan dalam <string.h> dan beroperasi berdasarkan jumlah byte yang Anda tentukan, sehingga bersifat umum untuk tipe data apa pun.

#include <stdio.h>
#include <string.h>

int main(void) {
    int src[] = {1, 2, 3};
    int dest[3];
    memcpy(dest, src, sizeof(src));
    printf("%d %d %d\n", dest[0], dest[1], dest[2]);
    return 0;
}

Signatur memcpy

void *memcpy(void *dest, const void *src, size_t n);

Fungsi ini menyalin tepat n byte dari src ke dest dan mengembalikan dest. Gunakan sizeof untuk mendapatkan jumlah byte yang tepat.

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "copy me";
    char dest[16];
    memcpy(dest, src, strlen(src) + 1);
    printf("%s\n", dest);
    return 0;
}

Menghitung byte dengan benar

Jumlah yang dihitung adalah byte, bukan elemen. Untuk array int, Anda harus mengalikannya dengan sizeof(int).

Menggunakan sizeof(array) pada array sungguhan secara otomatis menghasilkan ukuran total dalam byte.

#include <stdio.h>
#include <string.h>

int main(void) {
    double a[4] = {1.5, 2.5, 3.5, 4.5};
    double b[4];
    memcpy(b, a, 4 * sizeof(double));
    printf("%.1f %.1f\n", b[0], b[3]);
    return 0;
}

Wilayah tidak boleh saling tumpang tindih

memcpy memiliki perilaku yang tidak terdefinisi jika wilayah sumber dan tujuan saling tumpang tindih.

Jika rentang mungkin tumpang tindih, misalnya saat menggeser elemen dalam satu array, gunakan memmove yang menangani tumpang tindih dengan aman.

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[] = "ABCDEF";
    memmove(buf + 2, buf, 4);
    printf("%s\n", buf);
    return 0;
}

Signatur memset

void *memset(void *ptr, int value, size_t n);

Fungsi ini mengisi n byte pada ptr dengan byte value. Nilai tersebut dianggap sebagai unsigned char, sehingga hanya 8 bit terendah yang berpengaruh.

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[6];
    memset(buf, 'x', 5);
    buf[5] = '\0';
    printf("%s\n", buf);
    return 0;
}

Mengosongkan memori

Penggunaan memset yang paling umum adalah mengosongkan buffer atau struct menjadi semua nol sebelum digunakan.

memset(arr, 0, sizeof(arr)) menetapkan setiap byte menjadi 0, yang merupakan nilai nol yang valid untuk int, float, dan penunjuk.

#include <stdio.h>
#include <string.h>

int main(void) {
    int counts[5];
    memset(counts, 0, sizeof(counts));
    for (int i = 0; i < 5; i++) printf("%d ", counts[i]);
    printf("\n");
    return 0;
}

memset bekerja byte demi byte

Berhati-hatilah: memset menetapkan setiap byte, bukan setiap elemen. Menggunakannya untuk mengisi array int dengan nilai 1 TIDAK akan menghasilkan angka satu.

Setiap int akan mendapatkan nilai 0x01 pada setiap byte, sehingga menghasilkan 0x01010101, bukan 1.

#include <stdio.h>
#include <string.h>

int main(void) {
    int a[2];
    memset(a, 1, sizeof(a));
    printf("%d\n", a[0]);
    return 0;
}

Mengosongkan struct

memset berguna untuk menginisialisasi seluruh struct menjadi nol dalam satu pemanggilan, alih-alih menetapkan setiap bidang secara manual.

#include <stdio.h>
#include <string.h>

struct Point { int x; int y; int z; };

int main(void) {
    struct Point p;
    memset(&p, 0, sizeof(p));
    printf("%d %d %d\n", p.x, p.y, p.z);
    return 0;
}

Menyalin struct

Anda dapat menyalin struct dengan memcpy, meskipun penugasan biasa (b = a;) biasanya melakukan hal yang sama dengan lebih jelas.

memcpy lebih disukai saat menyalin melalui penunjuk generik void * yang tipe aslinya telah dihapus.

#include <stdio.h>
#include <string.h>

struct Rec { int id; char tag; };

int main(void) {
    struct Rec a = {42, 'A'};
    struct Rec b;
    memcpy(&b, &a, sizeof(a));
    printf("%d %c\n", b.id, b.tag);
    return 0;
}

memcmp: membandingkan memori

Fungsi terkait, memcmp(a, b, n), membandingkan n byte mentah dan mengembalikan 0 jika semuanya sama.

Tidak seperti strcmp, fungsi ini tidak berhenti pada terminator null, sehingga dapat digunakan pada data biner apa pun.

#include <stdio.h>
#include <string.h>

int main(void) {
    int a[] = {1, 2, 3};
    int b[] = {1, 2, 3};
    if (memcmp(a, b, sizeof(a)) == 0)
        printf("Arrays have identical bytes\n");
    return 0;
}

Mengapa fungsi ini cepat

memcpy dan memset sering dioptimalkan secara khusus dalam bahasa rakitan untuk memindahkan banyak byte dalam satu instruksi.

Keduanya biasanya jauh lebih cepat daripada pengulangan byte yang ditulis manual, jadi utamakan fungsi tersebut untuk pemindahan dan inisialisasi data dalam jumlah besar.

#include <stdio.h>
#include <string.h>

int main(void) {
    char big[1000];
    memset(big, 0, sizeof(big));
    printf("Cleared %lu bytes\n", sizeof(big));
    return 0;
}

Pemeriksaan singkat

Uji pemahaman Anda tentang perilaku memset pada tingkat byte.

Rangkuman

Anda telah mempelajari fungsi memori mentah:

  • memcpy menyalin n byte; wilayah tidak boleh tumpang tindih (gunakan memmove jika mungkin tumpang tindih).
  • memset mengisi n byte dengan satu nilai byte; sangat berguna untuk mengosongkan memori.
  • Jumlah dihitung dalam byte — gunakan sizeof dan waspadai perbedaan antara byte dan elemen.
  • memcmp membandingkan byte mentah tanpa berhenti pada '\0'.
Gratis untuk memulai

Belajar C dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
39
Pelajaran
144

Pertanyaan yang Sering Diajukan

Apakah pelajaran “memcpy dan memset” gratis?

Ya — teks lengkap “memcpy dan memset” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “memcpy dan memset”?

Fungsi memori mentah. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “memcpy dan memset” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. strlen, strcpy, strcat
  2. strcmp dan Perbandingan
  3. strtok dan Tokenisasi
  4. memcpy dan memset
← Kembali ke C Academy