sizeof operatörü ile ilgili klasik tuzaklar nelerdir? Bir diziyi fonksiyona geçirince sizeof neden farklı sonuç verir?

Cevap

sizeof derleme anında hesaplanan bir operatördür ve ifadenin tipinin byte cinsinden boyutunu verir. En sık tuzak, dizinin fonksiyon parametresi olarak geçirildiğinde pointer'a dönüşmesidir (array decay).

#include <stdio.h>

void f(int arr[10])            /* aslında: int *arr */
{
    printf("%zu\n", sizeof(arr));   /* 4 veya 8: pointer boyutu */
}

int main(void)
{
    int arr[10];
    printf("%zu\n", sizeof(arr));            /* 40 (int 4 byte ise) */
    printf("%zu\n", sizeof(arr) / sizeof(arr[0]));  /* 10 */
    f(arr);
    return 0;
}

Diğer klasik sorular

İfadeSonuç (32-bit int, C dili)Açıklama
sizeof('a')4C'de karakter sabiti int'tir (C++'ta 1)
sizeof("abc")4Sondaki \0 dahil
strlen("abc")3\0 hariç, çalışma zamanında
sizeof(char)1Tanım gereği her zaman 1
sizeof(i++)4İfade değerlendirilmez, i artmaz
sizeof(struct {char c; int i;})8Padding nedeniyle
int i = 5;
size_t n = sizeof(i++);
printf("%d\n", i);    /* 5: sizeof içindeki ifade çalışmaz (VLA hariç) */

char *p = "hello";
char  a[] = "hello";
sizeof(p);   /* pointer boyutu */
sizeof(a);   /* 6 */

Güvenli eleman sayısı makrosu

#define ARRAY_SIZE(x)  (sizeof(x) / sizeof((x)[0]))

Bu makro pointer'a uygulanırsa yanlış sonuç verir; GCC'de __builtin_types_compatible_p ile pointer'ı reddeden sürümler yazılabilir (Linux kernel'deki ARRAY_SIZE bunu yapar). Fonksiyonlara dizi geçirirken boyutu her zaman ayrı bir parametre olarak verin.

  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle