C dilinde dizeler, null byte ('\0') ile biten karakter dizileri olarak gerçekleştirilir. Dizeyi tanımlama örneği:
char str1[] = "hello"; // 6 karakterli dizi: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Dize literaline işaretçi
const değilse).Hatalardan kaçınmak için:
malloc, strcpy, tampon boyutunu kontrol edin).\0 ile sonlandığından emin olun.Doğru dize işlemi örneği:
char buffer[100]; strcpy(buffer, "test"); // TAMAM, buffer değiştirilebilir ve kesinlikle '\0' içerir
Aşağıdaki kodun çıktısı nedir ve hangi hatalara yol açar?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
Cevap: Program tanımsız davranış gösterecek, muhtemelen segmentasyon hatası verecektir, çünkü dize literalleri yalnızca okunabilir bellek alanında yer alır. Dize literal adresine değer yazmak mümkün değildir.
Hikaye Takım, dize dizisi ve işaretçiler hakkında kavramları karıştırdı. Bir işlev
char *output = "default";alıyordu ve sonrasındastrcpy(output, input);yapıyordu. Bu, ilk çalıştırmada çökmesine neden oldu çünkü kopyalama salt okunur belleğe yapılıyordu.
Hikaye Ağ çalışmaları sırasında, işlevin çıktısı
char *buf = NULL; strcpy(buf, data);ile tahsis edilen bir tamponda saklandı. Bu, başlatılmamış belleğe yazmaya neden oldu ve uygulamanın çökmesine yol açtı.
Hikaye Yerelleştirme paketinde ekip dizeleri bileşenler arasında geçiriyordu ve
\0karakterinin eklendiğinden emin olmuyordu. Bir seferinde işlev konsola gereksiz şeyler yazdı ve bellek iç yapısını bozdu.