Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengkompil C dan C Mengabaikan Panjang Tatasusunan dalam Tandatangan Fungsi?

Mengapa Pengkompil C dan C Mengabaikan Panjang Tatasusunan dalam Tandatangan Fungsi?

Barbara Streisand
Lepaskan: 2024-12-29 14:59:15
asal
265 orang telah melayarinya

Why Do C and C   Compilers Ignore Array Lengths in Function Signatures?

Array dalam Tandatangan Fungsi: Anomali Ingin tahu dalam C dan C

Dalam C dan C , panjang tatasusunan biasanya dinyatakan dalam tandatangan fungsi menggunakan sintaks int a[saiz]. Walau bagaimanapun, tingkah laku ingin tahu timbul apabila tempoh ini tidak dikuatkuasakan.

Kes Misteri dis(char a[1])

Pertimbangkan coretan kod berikut:

#include <iostream>
using namespace std;

int dis(char a[1]) {
    int length = strlen(a);
    char c = a[2];  // Attempt to access element beyond specified length
    return length;
}

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

Dalam contoh ini, fungsi dis mengisytiharkan parameter tatasusunan a bersaiz 1. Walau bagaimanapun, atur cara mengakses elemen melebihi saiz ini tanpa sebarang ralat pengkompil. Ini menimbulkan persoalan: mengapa pengkompil membenarkan panjang tatasusunan dalam tandatangan fungsi jika ia tidak dikuatkuasakan?

Ciri Bahasa Yang Aneh

Jawapannya terletak pada cara C dan C mengendalikan tatasusunan dalam panggilan fungsi. Pada hakikatnya, tatasusunan tidak boleh dihantar terus ke fungsi. Sebaliknya, penunjuk kepada elemen pertama tatasusunan dihantar, tidak membawa maklumat tentang panjang tatasusunan.

Oleh itu, saiz yang dinyatakan dalam tandatangan fungsi ([1] dalam kes ini) diabaikan oleh pengkompil . Keputusan ini bermula sejak tahun 1970-an dan telah menyebabkan kekeliruan yang ketara dalam kalangan pembangun.

Implikasi untuk Pengaturcaraan

Keanehan ini mempunyai beberapa implikasi:

  • Kurangnya Semakan Had Dikuatkuasakan: Tatasusunan dalam C dan C tidak mempunyai semakan sempadan terbina dalam, jadi adalah menjadi tanggungjawab pengaturcara untuk memastikan bahawa indeks tatasusunan tidak melebihi saiz tatasusunan.
  • Kerentanan Keselamatan Potensi: Penggunaan tatasusunan yang salah boleh menyebabkan limpahan penimbal, sejenis kerentanan keselamatan.
  • Terhad Pemahaman: Kekurangan panjang tatasusunan yang dikuatkuasakan boleh menyukarkan untuk memahami tujuan dan kekangan parameter fungsi.

Walaupun tingkah laku ini mungkin kelihatan membingungkan, ia adalah sebahagian daripada C dan bahasa pengaturcaraan C. Memahami implikasinya adalah penting untuk pembangunan kod yang selamat dan cekap.

Atas ialah kandungan terperinci Mengapa Pengkompil C dan C Mengabaikan Panjang Tatasusunan dalam Tandatangan Fungsi?. 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