C’de String Initialization Farkını Anlamak: Sonlandırıcılar ile ve Sonlandırıcısız

C programlamasında dizelerle çalışırken, başlatmanın nasıl çalıştığını anlamak çok önemlidir. Geliştiriciler arasında sıklıkla ortaya çıkan bir soru, bir karakter dizisini açık bir sonlandırıcı ile başlatmak ile boş bir dize ile başlatmak arasındaki farktır.

Bu blog yazısında, C’de dizeleri başlatmanın iki spesifik yolunu inceleyeceğiz:

char str1[32] = "\0"; 

ve

char str2[32] = ""; 

Her birinin ne anlama geldiğini ve birbirleriyle nasıl karşılaştırıldıklarını inceleyelim.

Dize Başlatımı Açıklaması

Bildirimler

Bu iki bildirim de 32 boyutunda bir karakter dizisi oluşturur. Ancak, farklı başlangıç değerleri içerirler.

  • char str1[32] = "\0";

    • Burada, dizinin ilk elemanını bir null karakter (\0) ile başlatıyorsunuz. Bu, dizeyi boş hale getirir ancak dizinin geri kalan elemanlarını başlatmamış olur (bu, bu elemanların belirsiz değerler içerebileceği anlamına gelir).
  • char str2[32] = "";

    • Bu, dizinin ilk elemanını da bir null karakter (\0) ile başlatır, ancak boş bir dize ile bildirim yaptığınız için dizinin geri kalan elemanlarını da dolaylı olarak \0 ile başlatır.

Pratik Örnek

Bu iki bildirimin boyutları nedeniyle eşdeğer olduğunu düşünebilirsiniz, ancak boyutların belirtilmediği durumlarda önemli farklar vardır.

Aşağıdaki kodu ele alalım:

char a[] = "a\0"; 
char b[] = "a";
printf("%i %i\n", sizeof(a), sizeof(b));

Çıktı:

3 2

Çıktının Açıklaması

  1. Dize a:

    • Bu dize, açıkça bir sonlandırıcı null karakter içerdiği için boyutu 3‘tür. İçerir:
      • 'a' karakteri (1 byte)
      • Açık sonlandırıcı (\0) (1 byte)
      • Sonundaki dolaylı null terminatör (1 byte)
  2. Dize b:

    • Bu durumda, dize yalnızca 'a' karakterini ve dolaylı null terminatörü içerir, bu da boyutunun 2 olmasına neden olur.

Önemli Çıkarımlar

  • Sonlandırıcılar ile Başlatma:
    Açık bir sonlandırıcı \0 dahil ettiğinizde, dize boyutunu bir byte artırmış olursunuz. C standardı, sonunda başka bir \0 ekler, bu da toplamda iki null terminatörü olduğu anlamına gelir.

  • Bellek ve Tahsisat:
    C’nin dizeler için belleği nasıl yönettiğini anlamak, hataları ve sorunları önlemeye yardımcı olabilir. Dizelerin nasıl başlatıldığını bilmek, uygulamalarınızda bellek tahsisatını ve erişimini büyük ölçüde etkileyebilir.

  • En İyi Uygulamalar:
    Dizelerinizi her zaman dikkatlice başlatın; ne kadar karakter ve sonlandırıcı dahil etmek istediğinizi göz önünde bulundurun.

Bu bilgilerle, C’deki dize başlatma inceliklerini daha rahat bir şekilde anlayabilirsiniz. İyi kodlamalar!