Halo, dan selamat datang kembali. Dalam kuliah ini, saya ingin
memberikan demonstrasi
untuk tantangan kami sebelumnya, yang membuat Anda memahami bagaimana
mengalokasikan memori secara dinamis menggunakan malloc.
Kami hanya akan melakukan beberapa pembacaan sederhana dari keyboard dan
kemudian menampilkan string, tetapi kami akan menggunakannya
dengan pointer yang dialokasikan secara
dinamis, pointer karakter.
Jadi mari kita memunculkan blok kode membuat proyek baru.
Dan kami hanya akan menyebutkan satu contoh alokasi memori dinamis ini.
Dan hal pertama yang perlu Anda lakukan
saat akan menggunakan alokasi memori dinamis adalah Anda harus memastikan bahwa Anda menyertakan lib standar.
Untungnya ketika Anda membuat proyek dalam blok kode, itu
akan secara otomatis menyertakannya untuk Anda.
Tetapi alasan kita perlu memasukkan lib standar adalah karena malloc, fungsi
malloc ada di sana. Dan malloc, ingat, adalah fungsi
utama untuk mengalokasikan memori. Anda juga memiliki calloc.
Calloc sangat penting karena calloc akan melakukan
beberapa perhitungan bagus tentang berapa banyak byte yang Anda butuhkan
karena itu adalah dua parameter.
Tetapi hal yang benar-benar bagus tentang calloc adalah ia menginisialisasi semua data
ke nol jika mereka int dan sebagainya, fungsi yang sangat bagus.
Anda memiliki alokasi ulang. Realloc akan memperpanjang memori yang
sudah dialokasikan. Jadi, Anda meneruskannya dalam sebuah pointer.
Dari penunjuk itu, ia menentukan berapa banyak memori yang dialokasikan
untuk itu dan menyalin semua yang ada di sana ke lokasi memori
baru, dan kemudian Anda juga menentukan berapa banyak byte
yang ingin Anda alokasikan, tambahkan saja ke lokasi memori baru, sungguh fitur yang bagus.
Tetapi ingat bahwa ketika Anda mengalokasikan memori untuk bilangan bulat menggunakan malloc, Anda
harus menentukan berapa banyak memori yang ingin Anda alokasikan byte, tetapi
Anda biasanya ingin menggunakan operator sizeof.
Jadi di sini mari kita lakukan itu.
Dalam metode utama saya, saya akan membuat bilangan bulat, dan saya hanya akan
mengatakan bahwa itu hanya akan menjadi ukuran. akan memasukkan ukuran berapa banyak byte
yang ingin mereka alokasikan saat runtime, jadi itu akan menyimpan ukurannya.
Hal lain yang ingin saya buat adalah saya ingin membuat pointer char, dan
ini hanya akan menjadi teks. Dan saya akan menginisialisasi
ini ke null karena tidak langsung mengarah ke apa pun.
Sekarang hal pertama yang ingin saya lakukan adalah saya ingin meminta pengguna untuk memasukkan ukuran.
Jadi saya akan mengatakan
printf, saya akan mengatakan masukkan batas teks.
Dan mereka akan memasukkan nomor berapa banyak byte yang ingin dialokasikan
benar-benar menjadi jumlah karakter.
Dan kemudian saya akan membacanya dengan menggunakan scanf.
Scanf, parameter pertama adalah tipe penentu format untuk tipe data.
Ini akan menjadi persen d karena saya membaca bilangan bulat.
Dan kemudian ingat, scanf mengambil pointer.
Kita sekarang tahu bahwa fungsi
yang mengambil pointer, Anda memerlukan alamat untuk masuk.
Jadi jika saya akan melewati ukuran, ukuran bukan alamat kecuali saya menggunakan alamat operator.
Jadi saya akan ampersand dan saya akan
mengatakan ukuran, itu akan membaca dalam jumlah byte.
Setelah saya memiliki jumlah byte, saya sekarang dapat mengalokasikan memori untuk itu menggunakan fungsi malloc.
Dan malloc akan mengembalikan pointer kosong.
Dan pointer akan menjadi alamat pertama untuk memori
yang baru dialokasikan itu. Jadi, Anda dapat menetapkannya langsung ke teks.
Karena ingat, teks adalah pointer.
Kami ingin mengarahkan teks ke alamat baru yang dikembalikan ini.
Karena malloc mengembalikan pointer kosong, kita harus melemparkannya.
Tipe data yang kita tunjuk adalah karakter jadi kita ingin mengatakan char star,
dan kemudian kita bisa memanggil fungsi malloc.
Fungsi malloc mengambil jumlah byte.
Jadi jumlah byte, jika Anda hanya memasukkan jumlah byte, itu hanya
akan mengalokasikan banyak byte. Tetapi tergantung pada jenis
datanya, jenis datanya mungkin dua atau empat byte.
Jadi jika Anda ingin mengalokasikan 10 karakter,
Anda ingin memastikan bahwa Anda
mengalikan 10 karakter kali ukuran char.
Jadi sekarang kita
akan mengatakan n kali sizeof. Operator sizeof sering digunakan dalam fungsi malloc karena
tidak bergantung pada mesin, dan ini
akan memberi tahu Anda berapa banyak yang sebenarnya perlu Anda alokasikan.
Sekarang ini lebih relevan ketika Anda memiliki bilangan bulat. Ingat, bilangan bulat, tergantung pada
sistem yang Anda gunakan, arsitektur yang Anda jalankan, bilangan
bulat dapat diwakili oleh empat byte, dua byte, biasanya
dua atau empat byte.
Jika Anda mengatakan saya ingin menyimpan satu bilangan bulat,
jadi saya hanya akan membuat empat byte memori, yah, itu mungkin tidak
benar karena bagaimana jika itu dua byte.
Jadi Anda selalu ingin melakukan
berapa banyak bilangan bulat atau berapa banyak karakter yang ingin Anda buat dan kemudian
mengalikannya dengan ukuran karakter di sistem Anda. Operator sizeof akan memberi Anda jumlah byte
yang ditempati oleh char. Jadi jika Anda ingin membuat
10 karakter, katakan 10 kali ukuran char. Jika Anda ingin membuat 10
bilangan bulat untuk menyimpan
10 bilangan bulat, Anda mengatakan 10 kali ukuran int, itu sangat penting.
Sekarang dengan fungsi calloc, Anda tidak perlu melakukan itu. Calloc sebenarnya
membutuhkan dua parameter. Dan parameter pertama
adalah pointer saya pikir dan kemudian
parameter kedua adalah ukuran byte.
Jadi jika Anda mengatakan 24 int, maka yang Anda lakukan hanyalah memasukkan
24 dan secara otomatis mengalokasikan untuk Anda.
Jadi calloc adalah alat yang sangat bagus untuk digunakan karena Anda tidak perlu melakukan perkalian ini.
Jadi untuk calloc, parameter pertama adalah ukurannya.
Jadi jika Anda ingin membuat 10 int, Anda cukup memasukkan 10.
Dan kemudian parameter kedua
adalah ukuran byte. Jadi Anda tidak perlu melakukan perkalian. Ini menghemat sedikit langkah Anda.
Sekarang setelah kami mengalokasikan memori,
Anda ingin memastikan bahwa teks tidak nol sebelum Anda mencoba melakukan de-referensi teks.
Jadi Anda selalu ingin membungkus ini di sekitar bukan teks, dan itu akan
mengatakan itu bukan nol atau Anda bisa melakukannya secara eksplisit dan mengatakan
jika teks tidak sama dengan nol.
Saya selalu ingin melakukan itu karena sangat, sangat
berbahaya untuk mencoba menghilangkan referensi sebuah pointer.
Apapun bisa terjadi. Anda mungkin dapat menulis data ke dalamnya.
ke dalamnya. Itu hanya akan menulisnya di tempat lain di memori. Jadi itu
akan mengacaukan program Anda atau Anda mungkin memiliki kesalahan segmentasi dan program mungkin macet.
Tetapi selama Anda benar-benar mengalokasikan memori itu, Anda
sekarang dapat benar-benar membaca di beberapa data.
Anda dapat menggunakan git s atau Anda dapat menggunakan scanf di sini.
Tapi apa yang ingin Anda
lakukan adalah Anda ingin mencetak, memasukkan beberapa
teks dan kami juga ingin menambahkan feed baris di sini sehingga mudah dibaca.
Dan kami akan menggunakan scanf karena itulah yang kami kenal.
Dan scanf hanya akan membaca dalam
persen.
Sebenarnya, saya akan menunjukkan trik.
Saya akan menggunakan scanf untuk membaca karakter berikutnya sehingga berhenti
dan kemudian saya akan menggunakan get s untuk membaca dalam teks.
Dan mendapat hanyalah fungsi lain yang biasanya Anda dapat menggunakan f mendapat. Anda hanya perlu mengaturnya untuk mengaturnya
ke aliran input.
Tapi get akan membaca dari aliran input standar, yang secara default adalah keyboard.
Dan mendapat akan mengambil pointer. Jadi yang harus kita lakukan adalah mengirimkan
teks karena itu sudah menjadi pointer, kita tidak perlu memasukkan alamat operator.
Dan hal yang menyenangkan dengan get ask adalah Anda dapat membaca dalam beberapa string yang dipisahkan oleh spasi.
Setelah kita benar-benar membaca,
kita bisa mencetaknya. Jadi kita dapat mengatakan teks yang diinput
jika yang diinput adalah kata persen s garis miring terbalik
n dan kemudian teks koma. Teks adalah penunjuk.
Printf mengambil pointer. Kita tidak perlu melakukan de-referensi.
Karena jika Anda hanya menampilkan
teks, teks akan menampilkan nilai pointer yang akan menjadi alamat.
Kami sebenarnya ingin menampilkan nilai dari apa yang ditunjuk oleh teks.
Dan kemudian kita selesai. Oh tidak, kita pasti belum selesai. Kami ingin menelepon gratis kami.
Kami ingin membebaskan pointer kami.
Padahal saat kita keluar, memorinya akan bebas. Kami masih ingin memastikan bahwa kami
membebaskannya, dan kemudian kami juga mungkin ingin hanya untuk diamankan, kami ingin mengatur teks sama dengan nol.
Jadi mari kita lanjutkan dan bangun ini dan lihat apa yang terjadi.
Dan saya punya masalah karena saya tidak membaca dalam
variabel yang tepat.
jadi di sini saya tidak menggunakan variabel yang tepat. Saya ingin menggunakan ukuran, dan
sepertinya
kami baik-baik saja.
Jadi di sini kita mulai satu perbedaan di sini adalah Anda
tidak perlu mereferensikan teks karena teks adalah penunjuk karakter.
Anda hanya perlu melakukan de-referensi jika di pointer dan lain sebagainya. Jadi Anda hanya ketika
Anda menggunakan persen s, secara otomatis tahu untuk de-referensi
pointer karakter.
Itulah satu perbedaan ketika Anda menggunakan pointer
karakter versus pointer lainnya. Pointer lain yang harus
Anda de-referensi untuk mendapatkan nilai karena Anda tidak dapat benar-benar
menyalin string ke array string dan sebagainya.
Anda tidak akan pernah bisa membuat teks bintang
sama, Anda harus selalu menggunakan salinan str jika Anda ingin menyalin teks.
Karena ingat dari kuliah, Anda tidak bisa
benar-benar menetapkan data ke array, dan penunjuk karakter adalah array.
Jadi di sini ini terlihat benar. Tidak ada alasan untuk tidak merujuknya.
Kami ingin membangun ini, dan kemudian kami ingin menjalankannya.
Dan Anda akan melihat kami menempatkan batas teks.
Jadi katakanlah kita memasukkan 5, 6 untuk jason dan yang
tercetak adalah input jason.
Dan Anda dapat bermain-main dengan program ini. Tetapi sekali lagi, takeaways
dari ini termasuk lib standar saat Anda melakukan malloc.
Inisialisasi pointer karakter Anda ke nol. Lakukan scanf,
gunakan ampersand karena ukuran bukan penunjuk.
Saat Anda mallocing, malloc mengembalikan pointer kosong, jadi Anda harus melakukan cast.
Anda selalu ingin masuk ke dalam malloc Anda. Lakukan sizeof operator
untuk apa yang ingin Anda alokasikan. Kali, berapa banyak karakter aktual
atau bilangan bulat. Ini lebih berlaku untuk bilangan bulat
dan tipe data primitif secara teknis untuk karakter. Anda bisa melakukan ukuran, itu akan berfungsi dengan baik.
Anda selalu ingin memeriksa nol, pastikan itu bukan nol.
Saat Anda menggunakan string karakter.
Dan kemudian kita cukup memasukkan beberapa teks, disimpan di get kita dan mencetaknya.
Dan yang tak kalah pentingnya, kami selalu ingin membebaskan pointer kami sehingga kami
dapat mengembalikannya ke heap. Semoga ini membantu. Terima kasih.