C -> Dynamisches Array

Hallo an alle!

Wenn ich folgendes in C schreibe, so lege ich ein normales Array an:

#include

int main(int argc, char* argv[]) {
char zeile[50];
return 0;
}

Was muss ich machen, um ein dynamisches Array anzulegen? Geht das mit C überhaupt oder ist das abhängig vom Compiler bzw. den Varianten C90/C95/C99?

Gruß PHANTOM

Hallo an alle!

Wenn ich folgendes in C schreibe, so lege ich ein normales
Array an:

#include

int main(int argc, char* argv[]) {
char zeile[50];

return 0;
}

Was muss ich machen, um ein dynamisches Array anzulegen? Geht
das mit C überhaupt oder ist das abhängig vom Compiler bzw.
den Varianten C90/C95/C99?

in etwa sowas:

#include 
#include 

int main(int argc, char\* argv[]) {
 char \*zeile = (char \*)malloc(50\*sizeof(char));
 ...
 free(zeile);
 return 0;
}

Grüße

CMБ

in etwa sowas:

#include
#include

int main(int argc, char* argv[]) {
char *zeile = (char *)malloc(50*sizeof(char));

free(zeile);
return 0;
}

Grüße

CMБ

Hallo!

Danke für die Antwort!

So habe ich mir das dann auch gedacht, dass ich den Speicher allokiere.
Aber gibt es auch eine andere Variante? Ich verwende Pelles C und mir wurde gesagt, dass dieser „dynamische Arrays“ kann, dies aber C nicht können sollte.

Gruß PHANTOM

Grad gefunden auf der englischen wikipedia-Seite:

"In computer science, a dynamic array, growable array, resizable array, dynamic table, or array list is an array data structure that can be resized and allows elements to be added or removed. It is supplied with standard libraries in many modern mainstream programming languages.

A dynamic array is not the same thing as a dynamically-allocated array, which is a fixed-size array whose size is fixed when the array is allocated; for more information of this type of array, see array."
(http://en.wikipedia.org/wiki/Dynamic_array)

Okay, da gibt es eine Unterscheidung.

Aber wie wende ich das auf C an?
Gruß PHANTOM

Hallo PHANTOM

Du kannst die Grösse nachträglich mit realloc() ändern:
http://www.cplusplus.com/reference/clibrary/cstdlib/…
Ich habe das aber nie getestet.

In computer science, a dynamic array, growable array,
resizable array, dynamic

Das meint Container, die, je nach Funktions-Umfang, mit einem gewissen Aufwand auch für C gemacht werden können. Das wird so getrickst, dass sich ein Objekt immer die Adresse des nächsten merkt, so kann man sich der Reihe nach „durch hangeln“, eine „verkettete Liste“ nennt man sowas. Da schreibst Du, solange Du willst.

Ein Beispiel findest du hier:
http://members.aon.at/amando1957/simple_list.cpp

Ich bin halt C++ gewohnt, für C muss man noch „typedef struct“ daraus machen, und die Referenzen (mit &amp:wink: durch Zeiger ersetzen.

lg
Martin B

Quellcode…
Hallo!

Ich abe nun ein Beispiel, es geht um Folgendes:

#include 

int main(int argc, char \*argv[]) {
int anzahl;

printf("Anzahl: ");
scanf("%d", &anzahl);

int a[anzahl];
return 0;
}

Die Frage ist ob a ein dynam. Array ist, da die Länge des Arrays erst zur Laufzeit eingelesen wird und nicht schon fest bspw. da steht int a[100];
Dürfte das in C überhaupt so gehen? Bzw. ist das abhängig von den Varianten C90/C95/C99?

Gruß PHANTOM

Hallo,

#include

int main(int argc, char *argv[]) {
int anzahl;

printf(„Anzahl: „);
scanf(“%d“, &anzahl);

int a[anzahl];
return 0;
}

[…]

Dürfte das in C überhaupt so gehen? Bzw. ist das abhängig von
den Varianten C90/C95/C99?

Mit dem Beispiel mit malloc(), das weiter oben im Thread gepostet wurde geht das. Du musst halt nur die 50 durch a ersetzen.

Grüße,
Moritz

Hallo!

Mit dem Beispiel mit malloc(), das weiter oben im Thread
gepostet wurde geht das. Du musst halt nur die 50 durch a
ersetzen.

Ich weiß, dass es mit malloc funktioniert, aber das war nicht meine Frage.

Gruß PHANTOM

Hallo

Ich abe nun ein Beispiel, es geht um Folgendes:

#include

int main(int argc, char *argv[]) {
int anzahl;

printf(„Anzahl: „);
scanf(“%d“, &anzahl);

int a[anzahl];
return 0;
}

Die Frage ist ob a ein dynam. Array ist, da die Länge des
Arrays erst zur Laufzeit eingelesen wird und nicht schon fest
bspw. da steht int a[100];
Dürfte das in C überhaupt so gehen? Bzw. ist das abhängig von
den Varianten C90/C95/C99?

Hier stehts:
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

ein block-scope(!)-Konstrukt vom Typ array[n] ist
also ab C99 gegeben, einige Compiler (z.B. gcc)
unterstützen dies aber bereits als Extension.

Grüße

CMБ

Hier stehts:
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

ein block-scope(!)-Konstrukt vom Typ
array[n] ist
also ab C99 gegeben, einige Compiler (z.B. gcc)
unterstützen dies aber bereits als Extension.

Ah, das erklärt schon einiges. Aber block-scope-Konstrukt? Das ist doch wenn in einer Funktion nur lokal etwas gilt, nach dem Verlassen der Funktion wird der Speicher wieder freigegeben. Aber was hat das mit diesem Zusammenhang zu tun?

Das bedeutet ich bräuchte eine ältere Variante C95 oder C90, so dass eine Warnung geworfen wird? (Benötigt für Übungszwecke, dass man nicht verführt wird das zu nehmen, anstatt malloc).

Gruß PHANTOM

Hi PHANTOM
Meines Wissens nach wird dir ein C-Compiler bei dem Code oben als erstes meckern, das a eine konstante Größe braucht.
Ich glaube nicht, das es in C anders als mit malloc, realloc, etc. möglich ist einem Array eine dynamische Größe zu geben.
Gruß
re-G

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi PHANTOM
Meines Wissens nach wird dir ein C-Compiler bei dem Code oben
als erstes meckern, das a eine konstante Größe braucht.
Ich glaube nicht, das es in C anders als mit malloc, realloc,
etc. möglich ist einem Array eine dynamische Größe zu geben.
Gruß
re-G

Hallo!

Es geht, jedoch nur mit der C99-Variante, nicht mit ANSI-C.

Gruß PHANTOM