Mengapakah Saya Tidak Boleh Menetapkan `kosong*` kepada Penunjuk Bukan Kosong dalam C , Tetapi Saya Boleh dalam C?

Patricia Arquette
Lepaskan: 2024-10-31 11:22:29
asal
222 orang telah melayarinya

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

void Penunjuk: Mendedahkan Jurang Antara C dan C

Apabila bercakap mengenai penunjuk batal, C dan C mempamerkan gelagat yang berbeza. Isu ini berkisar tentang keizinan untuk memberikan nilai pulangan batal* kepada penunjuk bukan batal.

Dalam C, tugasan tersebut dibenarkan, seperti yang ditunjukkan oleh kod berikut yang menyusun tanpa ralat:

<code class="c">int* p = malloc(sizeof(int));</code>
Salin selepas log masuk

Walau bagaimanapun, dalam C , kod yang sama gagal untuk disusun, menyerlahkan penyemakan jenis yang lebih ketat dalam C . Percanggahan ini berpunca daripada perbezaan cara penunjuk tidak sah dikendalikan.

Walaupun C membenarkan penukaran tersirat antara kekosongan dan mana-mana jenis penunjuk lain, C menyekat kebebasan ini. Dalam C , penukaran daripada void kepada jenis penuding tertentu memerlukan hantaran yang jelas. Jadi, hantaran diperlukan untuk kod berikut dihimpun dalam C :

<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
Salin selepas log masuk

Walaupun terdapat perbezaan ini, C membenarkan penukaran tersirat daripada penuding bukan kosong kepada batal*. Ciri ini jelas dalam kod berikut:

<code class="cpp">void foo(void* vptr) { }

int main() {
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}</code>
Salin selepas log masuk

Kod ini disusun tanpa isu dalam kedua-dua C dan C. Sebabnya terletak pada fleksibiliti yang wujud pada kekosongan dan sifat penunjuk. Mana-mana penunjuk objek boleh ditukar dengan selamat kepada batal tanpa kehilangan maklumat. Apabila kekosongan* ditukar kembali kepada jenis penuding asalnya, penuding tepat dipulihkan. Ini digambarkan oleh petikan daripada K&R2:

"Mana-mana penunjuk ke objek boleh ditukar kepada taip void * tanpa kehilangan maklumat. Jika keputusan ditukar kembali kepada jenis penunjuk asal, penuding asal akan dipulihkan ."

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menetapkan `kosong*` kepada Penunjuk Bukan Kosong dalam C , Tetapi Saya Boleh dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!