2016-04-15 8 views
6

Non riesco a trovare nei documenti standard C in particolare dove dice che gli array multidimensionali sono contigui. Mentre può essere implicito dal fatto che gli elementi dell'array sono contigui, voglio una prospettiva dalla comunità.Gli array multidimensionali C sono contigui senza buchi?

Il codice seguente stampa i numeri nell'ordine in cui mi sarei aspettato, che è 1 - 9.

#include <stdio.h> 

int main() 
{ 
    int a[][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
    int* p = (int*)a; 
    int i; 

    for (i = 0; i < sizeof(a)/sizeof(int); i++) 
     printf("%d ",p[i]); 

    return 0; 
} 
+1

Poiché gli array multidimensionali sono array di matrici, gli elementi sono contigui (credo). –

+1

È meglio - è un linguaggio abbastanza comune per elaborare array bidimensionali con un ciclo singolo anziché nidificato. Tutto questo codice sarebbe rotto se questo non fosse il caso. –

+0

Un 'array [x] [y]' di tipo 'z' è garantito per occupare (x * y * sizeof (z)) ** solo **. Nota che 'sizeof (z)' non è in tutti i casi garantito per occupare la quantità massima di bit necessari per il solo tipo - Può essere più grande e 'sizeof (char)', ad esempio, può essere superiore a 8 su alcune CPU . – tofro

risposta

10

Sì, può essere ottenuto per induzione. (solo per aggiungere, come un suggerimento, se questo aiuta, prova a pensare di array multidimensionali come array di array.)

Ad esempio, si consideri una matrice come a[3][3].

  • Quindi, a[0][0], a[0][1] e a[0][2] sono elementi di a[0] e saranno contigui.

  • Avanti, a[0] e a[1] sono elementi di a, quindi sarà contiguo

uno così via.

Presi insieme, a[0][2] e a[1][0] risiedono uno accanto all'altro, continuando così la contiguità.

Per una migliore rappresentazione visiva, vedere l'illustrazione di seguito.

La matrice, dire int arr[4][5], ha quattro righe , a[0], a[1], a[2] e a[3] e sono contigui.

Ora ciascuna di queste righe hanno cinque colonne, come a[n][0], a[n][1], a[n][2], a[n][3], a[n][4] e sono contigui.

Quindi, tutti gli elementi (e gli elementi di elementi) della matrice sono contigui.

Multi-Dimensional Array, Image CR: IIT-KGP

+1

Grazie per la conferma. Questo era il mio stesso pensiero. – Bran

6

sì sono contigui. Direi che "un array" (vale a dire singolare) è contiguo e che uno è multidimensionale. Ogni matrice all'interno deve essere contiguo e la matrice esterno deve essere un insieme contiguo di tali matrici ...

6

Secondo 6.2.5 Types P20:

Un tipo di matrice descrive un insieme non vuoto contiguo allocato di oggetti con un tipo di oggetto membro specifico, chiamato tipo di elemento. Il tipo di elemento deve essere completo ogni volta che viene specificato il tipo di matrice. ...

Pertanto tutti i tipi di array, multidimensionali o meno, sono allocati in modo contiguo.

2

C non ha array multidimensionali esplicitamente, C ha array di matrici e matrici in C sono rappresentate in modo contiguo in memoria. Quindi tutti gli array in C sono contigui.

+0

@JohnColeman Scusate, volevo essere sicuro che il nuovo arrivato comprendesse che C NON ha array multidimensionali, ha array di array. – fluter

+1

@fluter Quale sarebbe considerato un array "reale" multidimensionale? – Bran

+1

In realtà C standard menziona più matrici multidimensionali, tra cui, ad esempio, la nota 142 nel capitolo § 6.7.7: * "Quando diverse specifiche '' array di '' sono adiacenti, viene dichiarata una matrice multidimensionale." * – user694733