ProgramlamaBackend C Geliştirici

C dilinde sizeof operatörü nasıl çalışır ve kullanımında hangi tehlikeler vardır?

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

Cevap

sizeof operatörü, bir türün veya nesnenin derleme zamanında byte cinsinden boyutunu belirlemek için kullanılır. Genellikle bellek ayırma, yapıların ve dizilerin boyutlarını hesaplama için gereklidir.

Örnek:

int a; printf("%zu ", sizeof(a)); // int türündeki a değişkeninin boyutu printf("%zu ", sizeof(int)); // int türünün boyutu

Ayrıntılar:

  • sizeof her zaman 0 veya daha büyük olan size_t değerini döndürür.
  • Diziler için sizeof(array) tüm dizinin boyutunu döndürür, işaretçinin boyutunu değil.
  • Bir diziyi bir fonksiyona geçirdiğinizde, boyut bilgisi kaybolur.

Tehlike örneği:

void foo(int arr[]) { printf("%zu ", sizeof(arr)); // işaretçinin boyutunu verir, dizinin değil! } int arr[10]; foo(arr); // sizeof(arr) == 40 (genelde), foo seviyesinde sizeof(arr) == 8 (genelde)

Üzerinde düşünülmesi gereken soru

C dilinde sizeof('a') ifadesi ne döndürecektir?

Cevap: 'a' char gibi görünmesine rağmen, sizeof('a') ifadesinin sonucu int türünün boyutuna eşittir, çünkü karakter sabiti C'de inttir.

Örnek:

sizeof('a') // genelde 4, 1 değil

Konuyla ilgili bilgilerin eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye

Projede bir dizeyi kopyalamak için bellek ayırırken malloc(strlen(str) * sizeof(char)) şeklinde yapıldı ve son karakter göz ardı edildi. Bu, son byte'ın kaybolmasına ve standart kütüphane fonksiyonlarıyla çalışırken hatalara neden oldu.

Hikaye

Modüllerden biri, yapının tüm boyutunu bekleyerek fonksiyonda sizeof(arr) kullandı, ancak yalnızca işaretçinin boyutunu elde etti. Sonuç olarak belleğe çok az veri yazıldı ve bu da heap'in bozulmasına neden oldu.

Hikaye

Bir geliştirici, bir harf için bellek ayırmak amacıyla sizeof('a') kullanmaya karar verdi, 1 byte beklerken 4 (veya 8) aldı — bu, bellek israfına ve beklenen boyuta bağımlı kodda sorunlara yol açtı.