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);
strcpy
Basitçe kopya fonksiyonu gelen bayt src
için dest
kadar nul-sonlandırma karakterin olduğu anlatma strcpy
karakterleri 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 src
parametrenin bir dize olduğunu düşünmez veya gerektirmez . Çünkü memcpy
sadece ileriye doğru tarayamazsrc
için bayt kopyalama dest
bir 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";
.