Saya selalu melihat const char * digunakan dengan cara ini, dan libc membuat asumsi untuk efek ini.

Selama ulasan API, saya katakan const char * harus dianggap sebagai string NULL diakhiri, maka seseorang mengatakan itu tidak harus - jadi tidak ada asumsi yang dapat dibuat.

Kita masih bisa menjadi asumsi pembuatan defensif, tetapi kita dapat menulis kode lebih sedikit.

Mengingat semua fungsi libc yang menggunakannya dengan cara ini, adakah yang baik dalam standar C atau C ++ ISO yang mengatakan harus menjadi string yang diakhiri NULL?

2
Zak 5 April 2021, 19:08

2 jawaban

Jawaban Terbaik

Apa yang dapat kita asumsikan tentang memori pada, atau mulai dari, alamat pointer ke const char mengandung konteks tergantung.

const char Pointer adalah sering digunakan sebagai pointer ke teks ASCII ("string"), tetapi tidak harus; Pointer seperti itu juga bisa menunjukkan data sewenang-wenang, atau ke satu char.

API yang mengandalkan string yang dihentikan null harus mengatakan demikian, dan mereka melakukannya (misalnya https: //linux.die .NET / Man / 3 / strcpy).

9
Peter - Reinstate Monica 5 April 2021, 16:19

Apakah standar ISO C atau C ++ menentukan const char * harus menjadi string yang dihentikan null?

Tidak, tidak ada batasan seperti itu. Sejauh menyangkut standar, const char * sama seperti jenis pointer lain dalam hal ini. Ini mungkin menunjuk ke NULL, itu dapat menunjuk pada array yang tidak diakhiri null, mungkin memiliki nilai yang tidak valid. Semua ini secara implisit diizinkan karena tidak dilarang.

Namun ada beberapa fungsi standar yang memiliki parameter const char * dan memang mengharuskan argumen yang dilewati adalah string yang dihentikan null.

Contoh:

const char* c1 = nullptr; // c1 is not a null terminated string: allowed
const char arr1[] {'a'};
const char* c2 = arr;     // c2 is not a null terminated string: allowed
{
    const char arr2[] {'\0'};
    c1 = arr2;            // is  a null terminated string: allowed
}  // c1 is invalid: allowed

std::strlen(c1); // not null terminated string: Undefined behaviour
std::strlen(c2); // not null terminated string: Undefined behaviour

Mengingat semua fungsi LIBC yang menggunakannya dengan cara ini

Tidak semua fungsi standar membutuhkan string untuk dihentikan null. Sebagai aturan praktis, fungsi yang menerima parameter count dapat digunakan dengan array terminatif non-nol selama array setidaknya selama count.


NULL string yang dihentikan

String tidak dihentikan oleh NULL. NULL Apakah makro yang mengembang ke konstanta pointer nol (atau berpotensi dalam C, konstan yang dikonversi menjadi void*). Sementara karakter Null Terminator bukan pointer.

2
eerorika 5 April 2021, 16:58