2012-05-25 16 views
14

Olası Çoğalt:
May I treat a 2D array as a contiguous 1D array?İki boyutlu bir diziye tek boyutlu bir adama erişmek yasal mıdır?

Aşağıdaki kodu düşünün:

int array2d[10][10]; 
int *array1d = array2d[0]; 

ben işe yaramaz bir uygulama duymadım, ama yasal olduğunu array1d aracılığıyla array2d erişim ve işleme? Standartın hangi bölümü buna izin veriyor? Standart önleme uygulamalarında, ikinci seviye dizilerinin her biri arasında fazladan boşluk veya dolgu yapmaktan başka bir şey var mı (gerekli değil ama yine de)?

Bonus soru: , int[100] erişiminin reinterpret_cast veya C stili bir gerektirmeyen bir yolu var mı?

+0

Bunu, her zaman dahili olarak tek boyutlu bir dizi olarak saklayan bir sınıfa sarabilirsiniz. – chris

+3

C++ gizlenmiş yarışma için kaydoldum :)? – ScarletAmaranth

+1

Değil int * array1d = array2d [0]; 'biraz daha basit? – ildjarn

cevap

5

Bellek sunulduğunda, standart bunu resmi olarak tanımlanmamış bir davranışa örnek olarak verir, ancak aslında her zaman çalışır. [Düzenleme: C99, §J.2 (Tanımsız davranış):

  • Bir dizi alt simge aralık dışında, bir nesne verilen simge olmayan görünüşte erişilebilir olsa bile (Burada, aklımdan ne lvalue ifadede gibi bir [1] [7] int beyan verilen [4] [5])

değilim alıyoruz gibi olsa geçerli olduğu tamamen belli bir dizinin başlangıcının adresi ve onu bir derleme türü.

Diziler bitişik olmalıdır, bu nedenle dizinin öğeleri arasında herhangi bir dolgu ekleyemez. Bu, int dizisinin veya dizilerin dizisinin olup olmadığı doğrudur.

0

Bu gerçekten yasaldır. Standart, çok boyutlu dizileri basitçe daha büyük 1D dizileri olarak belirtir. Elime geçen tam bir teklifim yok ama bunun doğru olduğunu biliyorum.

+0

Kısa bir süre önce standart dizileri 2D dizi düzeninde kazdım (burada [http://stackoverflow.com/questions/10618473/is-this-c-code-portable-assuming-multidimensional-arrays-have-continuous-mem/10618866 # 10618866)). 'T [n] 'dizisini yazan kısmın nerede olduğunu tam olarak bilmiyorum * tam olarak *' n * sizeof (T) 'dır. – Jon

+0

Temel olarak, ilk alıntıdaki "içerir" beni biraz tedirgin ediyor. Neden daha güçlü bir anlatım değil? "İçerir" sadece bir alt sınır verir. – Jon

+2

@Jon C++ 2003, §5.3.3/2: 'sizeof': Bir diziye uygulandığında, sonuç dizideki toplam bayt sayısıdır. Bu, n öğelerinin bir dizisinin boyutunun, bir öğenin boyutunun n katı olduğu anlamına gelir. –

İlgili konular