ProgramlamaC geliştiricisi

C dilinde dizelerle nasıl çalışılır? Karakter dizisi ile dize işaretçisi arasındaki farkı açıklayın. Dize ile çalışırken hatalardan nasıl kaçınılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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
  • Karakter Dizisi: Her bir eleman için bellek tahsis eder, null bitiş dahil. Dizi değiştirilebilir (eğer const değilse).
  • Dize İşaretçisi: Değiştirilemeyen bir dize literaline işaret edebilir veya tahsis edilmiş bir bellek alanına işaret edebilir. Dize literal genellikle salt okunur segmentte yer alır.

Hatalardan kaçınmak için:

  • Belleği doğru yönetin (kullanım için malloc, strcpy, tampon boyutunu kontrol edin).
  • Dize değişiklikleri için dize literal kullanmayın.
  • Tüm dizelerin \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

Kandırıcı Soru

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.

Gerçek Hataların Örnekleri


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ında strcpy(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 \0 karakterinin eklendiğinden emin olmuyordu. Bir seferinde işlev konsola gereksiz şeyler yazdı ve bellek iç yapısını bozdu.