SORU
2 NİSAN 2010, Cuma


Nasıl çok boyutlu diziler bellekte biçimlenmiş?

C, dinamik olarak aşağıdaki kodu kullanarak: öbek üzerinde iki boyutlu bir dizi tahsis edebilirim

int** someNumbers = malloc(arrayRows*sizeof(int*));

for (i = 0; i < arrayRows; i  ) {
    someNumbers[i] = malloc(arrayColumns*sizeof(int));
}

Açıkçası, bu aslında oluşturur tek boyutlu bir dizi işaretçileri için bir sürü ayrı tek boyutlu diziler tamsayılar, ve "Sistem" anlayabilecek ne yani istesem:

someNumbers[4][2];

Ama ben 2 boyutlu bir dizi aşağıdaki satırı olduğu gibi statik olarak bildirirken...:

int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];

...bir benzeri yok üzerinde oluşturulan yığın, ya da başka bir form tamamen yapısı? (yani işaretçiler 1D bir dizidir? Ne ve nasıl başvuru anladı mı?)

"Sistem," aslında bu sergiyi sorumlu nedir? " dediğimde de, Çekirdek? Ya da C derleyici derleme sırasında bu tür mu?

CEVAP
2 NİSAN 2010, Cuma


Bir statik iki boyutlu bir diziyi benziyor - sadece bellekte bitişik olarak ortaya koydu. Diziler, işaretçiler olarak aynı şey değildir, ama sık sık onları oldukça fazla kullanabilirsiniz çünkü birbirinin yerine bazen kafa karıştırıcı olabilir. Derleyici her şeyi güzelce hizaya yapar gibi takip edip, gerçi tutar. Bahsettiğin gibi statik 2D dizileri ile dikkatli olmak zorunda, eğer bir fonksiyon int ** bir parametre alarak bir geçirmeye çalışırsanız, kötü şeyler olacak beri. Burada hızlı bir örnek:

int array1[2][2] = {{0, 1}, {2, 3}};

Hafıza görünüyor: bunun gibi

0 1 2 3

tam olarakaynı gibi:

int array2[4] = { 0, 1, 2, 3 };

Ama eğer bu fonksiyon için array1 geçirilecek deneyin:

void function1(int **a);

bir uyarı (ve app dizi doğru erişmek için başarısız olur): var

warning: passing argument 1 of ‘function1’ from incompatible pointer type

2 BOYUTLU bir dizi int ** aynı şey değildir çünkü. Bir işaretçi bir dizi otomatik çürüyen giderse ancak "bir düzey derin" tabiri caizse. İşlev olarak ilan etmek gerekir:

void function2(int a[][2]);

ya

void function2(int a[2][2]);

Her şey mutlu olmak için.

Bu aynı kavramı uzanırnboyutlu diziler. Uygulamanız komik iş bu tür yararlanarak genellikle sadece zor anlamak için yine de yapar. Bu yüzden dikkatli ol.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012
  • LivestrongWoman

    LivestrongWo

    1 Aralık 2011