Tüm Can dizeleri bir düşünülebilir karakterlerin dizisi ( Evet ), tüm edebilirsiniz karakter diziler düşünülebilir dizeleri ( Yok ).
Neden olmasın? ve neden önemli?
Bir dizenin uzunluğunun dizenin bir parçası olarak hiçbir yerde saklanmadığını ve bir dizenin tanımlandığı standarda yapılan referansları açıklayan diğer cevaplara ek olarak, diğer "C kütüphanesi fonksiyonları dizeleri nasıl işler?"
Bir karakter dizisi aynı karakterleri tutabilirken, son karakteri nul sonlandırıcı karakter izlemediği sürece, bu sadece bir karakter dizisidir . Bu nul sonlandırıcı karakter, karakter dizisinin bir dize olarak ele alınmasına (işlenmesine) izin veren karakterdir.
C'de bir dizeyi bağımsız değişken olarak bekleyen tüm işlevler, karakter dizisinin boş bırakılmasını bekler . Neden?
Tüm dize işlevlerinin çalışma şekliyle ilgilidir. Uzunluk bir dizinin parçası olarak yer almadığından, dize işlevleri, nul karakter (örn. '\0'- ondalık sayıya eşdeğer 0) bulunana kadar dizide ileriye doğru tarayın . Bkz. ASCII Tablosu ve Açıklaması . Kullandığınız olursa olsun strcpy, strchr, strcspn, vb .. Bütün dize fonksiyonları itimat nul-sonlandırma İpin ucunun nerede tanımlamak için karakter olmanın günümüze.
İki benzer fonksiyonun karşılaştırılması string.h, nul sonlandırıcı karakterin önemini vurgulayacaktır . Örnek verelim:
char *strcpy(char *dest, const char *src);
strcpyBasitçe kopya fonksiyonu gelen bayt srciçin destkadar nul-sonlandırma karakterin olduğu anlatma strcpykarakterleri kopyalamaya durdurmak için. Şimdi benzer işlevi alın memcpy:
void *memcpy(void *dest, const void *src, size_t n);
İşlev benzer bir işlem gerçekleştirir, ancak srcparametrenin bir dize olduğunu düşünmez veya gerektirmez . Çünkü memcpysadece ileriye doğru tarayamazsrc için bayt kopyalama destbir kadar nul-sonlandırma karakteri ulaşıldığında, bir üçüncü parametre olarak kopyalamak için bayt açık sayıda gerektirir. Bu üçüncü parametre memcpy, aynı boyut bilgisini sağlar strcpy; boş bir sonlandırma karakteri bulunana kadar ileriye doğru tarayarak türetilebilir .
(bu da neyin yanlış gittiğini vurgular strcpy , işleve nul sonlandırılmış bir dize sağlamadığınız takdirde (veya bir dize bekleyen herhangi bir işlevi) - nerede duracağına dair hiçbir fikri yoktur ve bellek bölümünüzün geri kalanında mutlu bir şekilde yarışacaktır çağırma Tanımsız Davranışı bir kadar nul-karakteri ) ya da bir segmentasyon Arıza oluştuğunda - sadece bellekte bir yere bulunabilir olur
Yani neden bir bekliyor fonksiyonları nul-sonlandırılmış dize bir geçirilmelidir nul-sonlandırılmış dize ve öneminden söz .
char str[] = "hello";.