Bisakah int (*)[]
tipe yang tidak lengkap?
C 2018 6.2.5 1 mengatakan:
Pada berbagai titik dalam unit terjemahan, suatu jenis objek mungkin tidak lengkap (kurang informasi yang cukup untuk menentukan ukuran objek jenis itu) atau lengkap (memiliki informasi yang cukup).
Jadi tampaknya jika ukuran suatu jenis diketahui, jenisnya lengkap. 6.2.6.1 28 menetapkan bahwa jenis pointer tertentu harus memiliki ukuran yang sama (pointer ke void
dan karakter, pointer ke jenis yang kompatibel, pointer ke struktur, dan pointer ke serikat pekerja), tetapi pointer ke jenis lain dapat bervariasi.
Dalam implementasi C di mana semua pointer, atau semua pointer ke array int
, memiliki ukuran yang sama, maka ukuran int (*)[]
diketahui, sehingga akan lengkap. Dalam implementasi yang, katakanlah, menggunakan pointer berbeda untuk array besar, ukurannya tidak akan diketahui, sehingga tidak lengkap.
Seperti yang ditunjukkan MM , struktur tidak boleh mengandung anggota dengan tipe tidak lengkap, kecuali anggota array fleksibel akhir, per kendala dalam 6.7.2.1 3. Ini menunjukkan bahwa implementasi dengan satu ukuran pointer harus menerima struct { int (*p)[]; }
sementara implementasi yang memiliki perbedaan ukuran untuk array tersebut harus mendiagnosis pelanggaran kendala. (Ini pada gilirannya berarti pernyataan semacam itu bukan bagian dari kepatuhan ketat C.)
sumber
void *
lengkap menunjukkan bahwa pointer ke tipe yang tidak lengkap bisa lengkap. Itu tidak menunjukkan apakah pointer ke tipe tidak lengkap bisa tidak lengkap. Jika seseorang bertanya "Bisakah mamalia menjadi gajah?", Menunjukkan bahwa "Singa adalah mamalia" tidak akan menyatakan bahwa mamalia tidak bisa menjadi gajah. Pertanyaan bertanya apakah set X dari pointer ke tipe tidak lengkap dapat mengandung elemen yang tidak lengkap. Menunjukkan bahwa set X pointer ke tipe tidak lengkap berisi elemen yang lengkap tidak relevan.Jawaban:
Array dengan ukuran yang tidak diketahui tidak lengkap:
int (*)[]
Namun tipe ini tidak lengkap: Ini adalah pointer dari array denganint
ukuran yang tidak diketahui.Dan sebuah pointer memiliki ukuran yang terkenal:
Lebih lanjut Anda bahkan dapat melakukan dereferensi, berkat semantik array:
Edit
Selain itu, pointer selalu merupakan tipe yang lengkap. Ditulis hitam putih di 6.2.5 / 20:
sumber
printf
hanya menunjukkan bahwa pointer ke array yang tidak lengkap selesai dalam implementasi yang dieksekusi, seperti yang dinyatakan dalam pertanyaan — jika bukan karena 6.2.5 20, dikutip dalam paragraf terakhir, mungkin gagal untuk dikompilasi. 6.2.5 23 juga tidak relevan; itu memberi tahu kita ukuran diketahui dan konstan jika lengkap, dan kita sudah tahu bahwa lengkap berarti ukuran diketahui.int
harus memiliki ukuran yang sama satu sama lain, dan semua pointer ke arraystruct
harus memiliki ukuran yang sama satu sama lain, walaupun mungkin tidak semua pointer ke array dari berbagai jenisstruct
harus memiliki ukuran yang sama satu sama lain.T(*)[]
harus memiliki ukuran yang sama denganT(*)[5]
, karena mereka adalah tipe yang kompatibel dan kami dapat menambah atau menghapus kualifikasi