SORU
27 Mart 2014, PERŞEMBE


Neden C ve C derleyicileri onlar're asla zorlanan işlev imzaları dizi uzunlukları izin?

Bu öğrenme sürecinde ne buldum

#include<iostream>
using namespace std;
int dis(char a[1])
{
    int length = strlen(a);
    char c = a[2];
    return length;
}
int main()
{
    char b[4] = "abc";
    int c = dis(b);
    cout << c;
    return 0;
}  

Çok değişken int dis(char a[1]) , [1] hiçbir şey yapmak gibi görünüyor ve çalışmıyor
a[2] kullanabilirim çünkü. Gibi int a[] char *a. Dizi adı bir işaretçi ve bir dizi iletmek için nasıl biliyorum, benim bulmaca hakkında bu bölüm değil.

Bilmek istediğim Derleyiciler bu davranış (int a[1]) izin nedeni budur. Yoksa benim bilmediğim başka anlamları var mı?

CEVAP
27 Mart 2014, PERŞEMBE


İlk boyut uzunluğunu göz ardı edilir, ancak ek Boyutlar uzunluğu derleyici uzaklıklar doğru hesaplamak için izin vermek için gereklidir. Aşağıdaki örnekte, foo işlevi iki boyutlu bir dizi için bir işaretçi geçirilir.

#include <stdio.h>

void foo(int args[10][20])
{
    printf("%zd\n", sizeof(args[0]));
}

int main(int argc, char **argv)
{
    int a[2][20];
    foo(a);
    return 0;
}

[10] yok sayılır ilk boyut boyutu; derleyici sona indeksleme engellemez (resmi 10 öğeleri istiyor fark, ama gerçek sadece 2 sağlar). Ancak, 14* *ikinci boyut boyutu her satırın adım belirlemek için kullanılır, ve burada, resmi gerçek eşleşmesi gerekir. Yine, derleyici ikinci boyutun sonundaki dizin oluşturma kapalı ya da engellemez.

args[row][col] belirlediği bir öğe için bayt dizisi tabanından uzaklığı:

sizeof(int)*(col   20*row)

col >= 20, o zaman aslında bir sonraki satır (veya tüm dizinin sonunda kapalı) içine dizin unutmayın.

* *18, sizeof(int) == 4 nerede benim makinede 80 döndürür. Eğer almaya kalkarsam ancak, sizeof(args) aşağıdaki derleyici uyarı alıyorum:

foo.c:5:27: warning: sizeof on array function parameter will return size of 'int (*)[20]' instead of 'int [10][20]' [-Wsizeof-array-argument]
    printf("%zd\n", sizeof(args));
                          ^
foo.c:3:14: note: declared here
void foo(int args[10][20])
             ^
1 warning generated.

Burada, derleyici ancak dizi dizi büyüklüğünde bir yerine çürük var işaretçisinin boyutunu vermek için bu uyarı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012