Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Automatische dynamische Arrays

0 views
Skip to first unread message

Sönke Müller-Lund

unread,
Nov 9, 2009, 6:03:38 PM11/9/09
to
Hallo NG,

bisher bin ich stets davon ausgegangen, dass die Grᅵᅵe eines
automatischen Arrays zur Compilezeit konstant sein muss. Mit dem gcc
4.1.2 bekomme ich aber folgendes problemlos ᅵbersetzt:

schnipp

#include <stddef.h>

extern void doSomething(int a[], size_t n);

void foo(size_t n) {
int a[n];
doSomething(a, n);
}

schnipp

War das schon immer so, oder ist das ein "frisches" Feature? Mein
betagtes "Programmieren in C" von K&R sagt darᅵber nichts.

Grᅵᅵe
Sᅵnke Mᅵller-Lund

Claus Reibenstein

unread,
Nov 9, 2009, 6:14:32 PM11/9/09
to
Sᅵnke Mᅵller-Lund schrieb:

> bisher bin ich stets davon ausgegangen, dass die Grᅵᅵe eines
> automatischen Arrays zur Compilezeit konstant sein muss.

Das war bis 1999 auch der Fall. Mit dem damals verabschiedeten neuen
Standard (ISO/IEC 9899:1999) hat sich das geᅵndert.

> War das schon immer so, oder ist das ein "frisches" Feature? Mein
> betagtes "Programmieren in C" von K&R sagt darᅵber nichts.

K&R behandelte in der 2. Auflage auch nur ANSI-C von 1990 (ISO/IEC
9899:1990). Einen neueren K&R gibt es meines Wissens nicht.

Gruᅵ. Claus

Marcel Müller

unread,
Nov 10, 2009, 6:10:15 AM11/10/09
to
Hallo,

Sᅵnke Mᅵller-Lund wrote:
> bisher bin ich stets davon ausgegangen, dass die Grᅵᅵe eines
> automatischen Arrays zur Compilezeit konstant sein muss. Mit dem gcc
> 4.1.2 bekomme ich aber folgendes problemlos ᅵbersetzt:
>

> void foo(size_t n) {
> int a[n];
>

> War das schon immer so, oder ist das ein "frisches" Feature?

wie schon gesagt, ist C99.
Im Prinzip ist das ein typisiertes alloca.


Marcel

Claus Reibenstein

unread,
Nov 10, 2009, 7:24:21 AM11/10/09
to
Marcel Mᅵller schrieb:

> Im Prinzip ist das ein typisiertes alloca.

Du meinst malloc. Oder was meinst Du?

Gruᅵ. Claus

Harald Wenninger

unread,
Nov 10, 2009, 8:00:52 AM11/10/09
to
* Claus Reibenstein tat kund und zu wissen:
> Marcel Müller schrieb:

>> Im Prinzip ist das ein typisiertes alloca.
> Du meinst malloc. Oder was meinst Du?

Nein, er meint alloca.
Das ist eine (nicht standardisierte) Funktion auf manchen Unix-Systemen,
die Speicher dynamisch auf dem Stack alloziert. Der gcc auf Linux
beispielsweise realisiert (oder hat das zumindest mal so gemacht) Sachen
wie

int array[n];

mit einem Aufruf von alloca.

Gruß,
Harald

Thomas Koller

unread,
Nov 10, 2009, 8:01:08 AM11/10/09
to
Claus Reibenstein <4spame...@kabelmail.de> wrote:
> Marcel M�ller schrieb:

>> Im Prinzip ist das ein typisiertes alloca.
>
> Du meinst malloc. Oder was meinst Du?

Nein, schon eher alloca.

Bei malloc handelst dir ja ein Speicherloch an, wenn du den Speicher
nicht mehr selbst freigibst, und du kannst das Objekt auch nach
Ende der Funktion in dem du es allokiert hast weiterverwenden.

Tom

Rainer Weikusat

unread,
Nov 10, 2009, 9:11:36 AM11/10/09
to
Harald Wenninger <use...@bobok.org> writes:
> * Claus Reibenstein tat kund und zu wissen:
>> Marcel M�ller schrieb:

>
>>> Im Prinzip ist das ein typisiertes alloca.
>> Du meinst malloc. Oder was meinst Du?
>
> Nein, er meint alloca.
> Das ist eine (nicht standardisierte) Funktion auf manchen
> Unix-Systemen,

Das ist ein Interface, dass es seit UNIX(*) 32V gibt, das ebenfalls
seitdem augenscheinlich eine gewisse Menge von Menschen gerne wieder
loswerden moechte, obwohl der Grund dafuer noch nie besonders klar
war und die Funktionalitaet selber mittlerweile in der C-Norm
angekommen ist. Unterstuetzt wird es wenigstens von Solaris, AIX,
HP-UX, *BSD und allen GNU-Implementierungen.

Insofern scheint 'das ist eine nicht standisierte Funktion, die es auf
manchen UNIX(*)-Systemen nicht gibt' (oder sogar 'auf manchen
mittlerweile weitgehend in Vergessenheit geratenen UNIX(*)-Systemen
nicht gab') der Wahrheit naeher zu kommen.

Marcel Müller

unread,
Nov 10, 2009, 12:05:15 PM11/10/09
to
Rainer Weikusat wrote:
> Das ist ein Interface, dass es seit UNIX(*) 32V gibt, das ebenfalls
> seitdem augenscheinlich eine gewisse Menge von Menschen gerne wieder
> loswerden moechte, obwohl der Grund dafuer noch nie besonders klar
> war und die Funktionalitaet selber mittlerweile in der C-Norm
> angekommen ist. Unterstuetzt wird es wenigstens von Solaris, AIX,
> HP-UX, *BSD und allen GNU-Implementierungen.

Und auf allen mir bekannten DOS-artigen Systemen (DOS, OS/2, Win16, Win32)

> Insofern scheint 'das ist eine nicht standisierte Funktion, die es auf
> manchen UNIX(*)-Systemen nicht gibt' (oder sogar 'auf manchen
> mittlerweile weitgehend in Vergessenheit geratenen UNIX(*)-Systemen
> nicht gab') der Wahrheit naeher zu kommen.

:-) so in der Art. Es h�ngt aber letztlich nicht unbedingt vom OS ab,
sondern (auch) vom Compiler. Auf Plattformen mit Stack-Frames erzeugt es
oft nur eine Subtraktion vom Stack-Pointer. Ohne Stack-Frames geht es
auch, ist aber komplizierter.

Wissen sollte man das eher deshalb, weil die Allokation aus dem
Adressraum des Stacks heraus erfolgt, der gerade unter 32 Bit eine pro
Thread durchaus schnell endende Ressource ist.


Marcel

0 new messages