Array mit variabler Feldgröße erzeugen

#2442452
Lesenswert?

Hallo! Ich habe das Problem, dass ich ein Array mit variabler Feldgröße 
erzeugen möchte. Zum besseren verständnis:
1
 
2
int length = 2;
3
int array[length]; // array[-1]
4
int array2[2]; // funktioniert natürlich
Leider funktioniert das nicht. Im Debugger bekomm ich array mit dem 
Inhalt [-1] angezeigt.
In einschlägigen C-Büchern wird die Größe immer per #define definiert - 
also statisch. Ich kann mir nicht vorstellen, dass so etwas nicht 
funktionieren soll:
1
 
2
int length = zaehl(user); //zaehl gibt einen int zurück
3
int array[length];

Ich hoffe jemand kann helfen und erkären warum das nicht funktioniert.
#2442462
Lesenswert?

Christian Q. schrieb:


> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
> also statisch.

Dann solltest du weiterlesen, bis du im Kapitel über dynamische 
Speicherallokierung mittels malloc angelangt bist.

> Ich kann mir nicht vorstellen, dass so etwas nicht
> funktionieren soll:
>
1
> int length = zaehl(user); //zaehl gibt einen int zurück
2
> int array[length];
3
>
>

In C99 wurde dieses Feature hinzugefügt.
Mit C Versionen davor musst du selber Hand anlegen und den Speicher 
allokieren.
Gast #2442464
Lesenswert?

Christian Q. schrieb:
> Leider funktioniert das nicht. Im Debugger bekomm ich array mit dem
> Inhalt [-1] angezeigt.
Dein Quellcode füllt das Array ja auch nicht mit Werten, es wird nur 
definiert und nicht deklariert. Vielleicht ist der Debugger so schlau 
und macht das mit '-1' kenntlich oder der Compiler schreibt das rein. 
Gibt es überhaupt eine Fehlermeldung vom Compiler?
Dein Beispiel oben ist auch recht schlecht für Diagnosen geeignet, denn 
für den Compiler ist ersichtlich, dass das Array zwei Felder hat. Außer 
der Quellcode sieht ganz anders aus, als das was da oben steht.

Christian Q. schrieb:
> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
> also statisch. Ich kann mir nicht vorstellen, dass so etwas nicht
> funktionieren soll
Genau das ist aber so. Ausnahme, der Compiler kann den C99-Standard und 
er kompiliert auch danach.

Welcher Compiler wird von dir verwendet?
#2442483
Lesenswert?

Karl Heinz Buchegger schrieb:
> Christian Q. schrieb:
>
>
>> In einschlägigen C-Büchern wird die Größe immer per #define definiert -
>> also statisch.
>
> Dann solltest du weiterlesen, bis du im Kapitel über dynamische
> Speicherallokierung mittels malloc angelangt bist.

Das Kapitel Dynamische Speicherverwaltung konnte ich sogar finden und 
dort gibt es den Punkt Dynamische Arrays. Das hört sich doch schonmal 
recht passend an.

jiffies schrieb:
> Gibt es überhaupt eine Fehlermeldung vom Compiler?

Leider nein.

jiffies schrieb:
> Welcher Compiler wird von dir verwendet?

Es handelt sich um den XCode C compiler.
#2442615
Lesenswert?

Hier die Lösung aus dem ominösen Buch, etwas angepasst.
1
int get_rand() {
2
  srand(time(NULL));
3
  return rand() % 60;
4
}
5

6
void blub() {
7

8
  int *array;
9
  int length = get_rand(); //gibt einen int zurück
10
  array = (int *)malloc(length*sizeof(int));
11
  
12
  int x = 0;
13
  while (x < length) {
14
    array[x] = x;
15
    printf("%d\n", array[x]);
16
    x++;
17
  }
18
  
19
  if(array != NULL) {
20
    printf("%d", array[0]);
21
  }
22
}
#2442668
Lesenswert?

Peter II schrieb:
> Christian Q. schrieb:
>> Hier die Lösung aus dem ominösen Buch, etwas angepasst.
>
> - keine Fehlerbehandlung
> - keine Freigabe vom Speicher

Es ging mir in dem Moment nur um das anlegen dieses Arrays vom Prinzip 
her. Um diese Punkte werd ich mich noch kümmern müssen.

Rufus Τ. Firefly schrieb:
> Da Du das Array nicht initialisiert hast, steht da natürlich irgendwas
> drin. Und das zeigt Dir Dein Debugger an. Insofern ist Dein Schluss, daß
> das nicht funktionieren würde, nicht korrekt.
1
int dd = 2;
2
int array2[dd];
3
array2[0] = 0;
4
array2[1] = 1;
Aber selbst das funktioniert nicht. Der Inhalt bleibt -1.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren