Rumah > pembangunan bahagian belakang > C++ > Mengapakah Panjang Tatasusunan dalam Tanda Tangan Fungsi C/C Diabaikan oleh Pengkompil?

Mengapakah Panjang Tatasusunan dalam Tanda Tangan Fungsi C/C Diabaikan oleh Pengkompil?

Patricia Arquette
Lepaskan: 2024-12-22 16:28:15
asal
533 orang telah melayarinya

Why Are Array Lengths in C/C   Function Signatures Ignored by the Compiler?

Panjang Tatasusunan dalam Tandatangan Fungsi C/C: Anomali Mengelirukan

Dalam C dan C , tandatangan fungsi mungkin termasuk panjang tatasusunan dalam kurungan segi empat sama, seperti int a[ 1]. Walau bagaimanapun, tingkah laku ini telah membingungkan pembangun, kerana panjangnya kelihatan tidak mempunyai kesan praktikal.

Pertimbangkan contoh berikut:

#include <iostream>

int dis(char a[1]) {
    int length = strlen(a);
    char c = a[2];
    return length;
}

int main() {
    char b[4] = "abc";
    int c = dis(b);
    cout << c;
    return 0;
}
Salin selepas log masuk

Dalam kod ini, fungsi dis mengisytiharkan parameter tatasusunan dengan panjang 1 (a[1]), tetapi mengakses a[2] masih boleh dilakukan. Ini menimbulkan persoalan: mengapa pengkompil membenarkan panjang tatasusunan dalam tandatangan fungsi jika ia tidak dikuatkuasakan?

Kebenaran Disebalik Anomali

Jawapannya terletak pada tingkah laku unik tatasusunan yang lulus dalam C/ C . Tidak seperti kebanyakan bahasa lain, C dan C tidak membenarkan penghantaran terus tatasusunan ke fungsi. Sebaliknya, penuding kepada elemen pertama tatasusunan dihantar.

Akibatnya, panjang tatasusunan yang dinyatakan dalam tandatangan fungsi menjadi tidak relevan. Maklumat panjang tidak disertakan dalam penunjuk, jadi pengkompil hanya mengabaikan panjang dalam kurungan.

Tingkah laku ini berpunca daripada keputusan yang dibuat semasa peringkat awal pembangunan C pada tahun 1970-an. Walaupun ia telah menyebabkan kekeliruan selama bertahun-tahun, sintaks tetap berleluasa dalam kedua-dua C dan C .

Implikasi untuk Pembangun

Keanehan hantaran tatasusunan ini mempunyai beberapa implikasi:

  • Panjang tatasusunan dalam tandatangan fungsi harus diabaikan kerana ia tidak mempunyai kesan ke atas tingkah laku kod.
  • Array boleh diisytiharkan sebagai penunjuk (cth., char *a) untuk mengelakkan kekaburan ini.
  • Apabila menghantar tatasusunan kepada fungsi, adalah penting untuk memastikan bahawa indeks tatasusunan kekal dalam had , kerana maklumat panjang tidak tersedia dalam tandatangan fungsi.

Atas ialah kandungan terperinci Mengapakah Panjang Tatasusunan dalam Tanda Tangan Fungsi C/C Diabaikan oleh Pengkompil?. 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