Wenn ich ein mehrdimensionales Array wie folgt habe:Multi dimensionale Array Referenz in struct in c
int arr2d[2][3] = {{0,1,2}, {10,11,12}};
ich es auf eine Funktion, wie dies passieren kann:
void foobar(int arg[][3])
Dies ist kein Anruf durch value, das ist call by reference, also nur ein Zeiger auf die Startadresse, aber der Compiler weiß immer noch, dass es sich um ein 2D-Array handelt und ich kann darauf wie in der Funktion zugreifen.
Wie funktioniert das gleiche in einer Struktur?
typedef struct {
int arr2d[][3];
} Foobar_t
Zuerst gibt mir das: error: flexible array member in otherwise empty struct
. Ich kann das beheben:
typedef struct {
int dummy;
int arr2d[][3];
} Foobar_t
Es wird ohne Fehler oder Warnungen kompilieren. Aber wenn ich versuche, es zu benutzen wie Foobar_t foobar = {1337, arr2d}
ich einige Warnungen erhalten:
missing braces around initializer
initialization makes integer from pointer without a cast
Und wenn es den Zugriff auf: subscripted value is neither array nor pointer nor vector
.
Eindimensionale Arrays können leicht als Zeiger behandelt werden. Bei mehrdimensionalen Arrays muss der Compiler jedoch die Größe der verschiedenen Dimensionen kennen, um die Offsets korrekt berechnen zu können. Gibt es einen Weg ohne Cast (int (*)[3])
und warum unterscheidet sich die Syntax von dem Funktionsparameter?
Das ist also die Work-around möchte ich vermeiden:
#include <stdio.h>
static int testArr[2][3] = {{0,1,2},{10,11,12}};
typedef struct {
int *arr2d;
} Foobar_t;
int main(int argc, char** argv) {
Foobar_t foobar = {(int*)testArr};
int (*arr2d)[3] = (int (*)[3]) foobar.arr2d;
printf("testStruct_0_0: %d\n", arr2d[0][0]);
printf("testStruct_1_0: %d\n", arr2d[1][0]);
return 1337;
}
Edit:
Einige Kommentare deuten darauf hin, dass die Bezugnahme nicht das richtige Wort ist. Natürlich wird dies in der C-Sprache durch einen Zeiger implementiert. Die TLDR dieser Fragen lautet also: Wie sieht die Syntax für einen Zeigertyp zu einem multidimensionalen Array aus?
Die Antwort ist bereits in meinem Work-Around-Code zu sehen. Also das ist alles, fahr mit, nichts zu sehen;) Trotzdem danke für die Antworten.
Es gibt keinen Hinweis in C –
Sie nicht unvollständige Typen in einer Struktur mit Ausnahme der FAM haben, können bei das Ende einer Struktur mit mindestens einem anderen Mitglied (daher Ihr 'Dummy'-Mitglied). Und wenn Sie einen FAM haben, müssen Sie die Struktur dynamisch mit der richtigen Menge an Speicher belegen. –
In Ihrer Problemumgehung könnte Ihre Zeile 'Foobar_t foobar = {(int *) testArr};' sauberer geschrieben werden als 'Foobar_t foobar = {& testArr [0] [0]};' - keine Umwandlung notwendig. Die zweite Besetzung ist nicht so leicht zu vermeiden. –