ProgramlamaC geliştirici

C dilinde pointerlar ve diziler arasındaki farklar nelerdir? Bir diziyi fonksiyona nasıl doğru bir şekilde geçirebilirim?

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

Cevap.

C dilinde pointerlar ve diziler ilişkilidir, ancak aynı şey değildir:

  • Dizi — bellekte aynı türden elemanların toplamı, belirlenen boyutla tanımlanır.
  • Pointer — bellek içinde bir adresi tutan değişken, dizi veya ayrı bir nesneye işaret edebilir.

Bir diziyi bir fonksiyona geçirirken aslında dizinin ilk elemanına işaret eden bir pointer geçirilir (bu nedenle fonksiyon içinde sizeof dizinin boyutunu değil, yalnızca pointer’ın boyutunu verir).

Geçirmenin sözdizimi:

void foo(int arr[], int size) { // arr — aslında int* for (int i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }

Kandırmaca soru.

Soru: Fonksiyon içinde sizeof(arr) ifadesi ne döner, eğer arr parametre türü int arr[] ise?

Cevap: Pointer’ın boyutunu döner (sizeof(int*)), tüm dizinin boyutunu değil. Çünkü fonksiyona ilk elemanın adresi geçirilir, uzunluk bilgisi kaybolur.

Kod örneği:

void printSize(int arr[]) { printf("%zu ", sizeof(arr)); // sizeof(int*) genellikle 4 veya 8'dir }

Hikaye

Ticari bir projede, bir dizideki ortalamayı hesaplamak için yazılan kodda, içeride eleman sayısını sizeof(arr) / sizeof(arr[0]) alarak alıyordu, bu her zaman 1 veya 2 döndürüyordu, gerçek eleman sayısı yerine. Bu yüzden program verilerle hatalı çalıştı, değerleri yanlış ortaladı.


Hikaye

Bir projede dinamik olarak ayırtılan dizi bir fonksiyona ayrı bir uzunluk (boyut) saklanmadan geçirildi. Sonuç olarak fonksiyon, ne kadar eleman ayrıldığını bilmiyordu, sınırları aşmaya, bellek sızıntılarına veya bozmalara yol açıyordu.


Hikaye

Yanlışlıkla sabit boyutlu bir dizi pointer olarak kullanıldı ve bazı derleyiciler, dizinin tümünü yerine elemanlarını doğrudan memcpy ile atamaya izin veriyordu. Bu, veri yapısının parçalarının kaybolması veya yığın taşmasına neden olan, belirsiz bir hataya yol açıyordu.