2017-05-08 3 views
-1

Ich bin für die letzten 6 Stunden rumhängen und versuchen, dieses verdammte Problem zu lösen. Zuerst bin ich ein kompletter Neuling in c-Programmierung, also erwarte nicht zu viel von mir bitte .. Ich muss ein Programm schreiben, das ein Integer-Array innerhalb einer Struktur erstellt. Also habe ich einen Header geschrieben und neben dem main eine andere Quelldatei namens "intarray.c" erstellt, weil ich das tun muss. Ich habe alles usw. usw. eingefügt und brauche jetzt eine Funktion, die ein Argument "int n" erhält, das verwendet wird, um das int-Array a [n] innerhalb der Struktur zu erzeugen. Aber ich kann das nicht zur Arbeit bringen. Sorry für meine schlechte Erklärung, aber ich weiß nicht, was zum Teufel ich hier mache. Ich habe auch versucht, mit Zeigern zu arbeiten, aber das hat mich verwirrt und ich bin mir nicht sicher, ob sie notwendig sind.C - Erstellen einer Struktur in einer Quelldatei

Mein Header sieht wie folgt aus:

#ifndef INTARRAY_H_INCLUDED 
#define INTARRAY_H_INCLUDED 

struct IntArray 
{ 
    int length; 
    int numbers[]; 
}; 
void create(int); 
void destruct(); 
void read(int); 
void write(int, int); 

#endif // INTARRAY_H_INCLUDED 

und meine Funktion sieht wie folgt aus:

create(int n) 
{ 
    struct IntArray arr; 
    arr.length = n; 
    arr.numbers[n]; 
} 

Aber jetzt kann ich die Struktur nicht in anderen Funktionen nutzen, zum Beispiel wenn ich in das Array an einer bestimmten Position schreiben möchte. Wie kann ich das lösen? Und sry für dumme Fragen.

+3

Dieses Snippet wird nicht einmal kompiliert. Lesen Sie mehr über flexible Array-Mitglieder und dynamische Speicherzuweisung. Deine Funktionsprototypen sind auch falsch. Kurz gesagt: zu viele Fehler in fast keinem Code. Wiederholen Sie Ihre Kursunterlagen oder erhalten Sie ein gutes C-Buch und fragen Sie Ihren Tutor um Rat. – Olaf

+1

'struct IntArray * erstellen (int n) {Struktur IntArray * arr = Calloc (1, Größe von (* arr) + n * sizeof (int)); if (arr) {arr.Länge = n; } Rückkehr arr; } ' – BLUEPIXY

+0

Wenn eine Struktur ein flexibles Array-Element hat, muss es mit' malloc() 'zugewiesen werden, damit Sie die Größe des gewünschten Arrays hinzufügen können. – Barmar

Antwort

0

Sie müssen dynamisch Speicher reservieren:

struct IntArray 
{ 
    int length; 
    int * numbers; 
}; 

struct IntArray * create(int len) { 
    struct IntArray * ret = malloc(sizeof(struct IntArray)); 
    ret->length = len; 
    ret->numbers = malloc(len * sizeof(int)); 
    return ret; 
} 
0

Wenn Sie mit einem flexiblen Feldelements (FAM) arbeiten, benötigen Sie den Speicher für die Struktur und das Array als eine einzige explizit zuzuweisen Zuordnung, wie durch BLUEPIXY in ihrem comment veranschaulicht.

Sie müssen auch übersetzbar Code schreiben:

struct IntArray *create(int n) 
{ 
    struct IntArray *result = malloc(sizeof(*result) + n * sizeof(result->numbers[0])); 
    if (result != NULL) 
     result->length = n; 
    return result; 
} 

Wenn Sie auf einem 64-Bit-System, die Größe der Grundstruktur ist wahrscheinlich 8 Bytes, nicht die 4 Sie würden normalerweise erwarten, Da der Zeiger an einer 8-Byte-Grenze ausgerichtet werden muss, fügt der Compiler 4 Byte Padding hinzu. Auf einem 32-Bit-System wäre die Größe 4, da die Größe des flexiblen Array-Elements nicht in der Größe der Struktur enthalten ist.

Verwandte Themen