2016-06-28 5 views
1

Ich habe eine Frage über die Übergabe einer Struktur an eine Funktion ohne Deklaration der Struktur zuerst.Übergeben einer Struktur an eine Funktion wie folgt

Ich habe eine Funktion, die eine Struktur Zeiger wie dies geschieht:

static void DrawArc(struct MATH_POINT *p, other args); 

Ich weiß, ich

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

eine Struktur wie diese passieren kann, aber ich kann es auch tun, wie folgt aus:

DrawArc(&(struct MATH_POINT){0,0}, other args); 

Ich mache es auf diese Weise, weil ich auf einer eingebetteten Plattform mit sehr begrenzten Registerraum bin, und meine GUI Spaß ctions erfordern viele Argumente.

Aber meine Sorge ist, dass die Strukturen, die ich in der Argumentliste initialisiert habe, bleiben und RAM verbrauchen. Ist das möglich? Oder wird die Struktur zerstört, sobald die Funktion beendet ist?

Danke!

+1

Diese Frage kann nicht beantwortet werden, ohne den spezifischen Compiler und Prozessor zu kennen, den Sie verwenden. Außerdem, ob Sie mit optimierter Optimierung bauen werden. –

+0

Ich benutze arm-none-eabi und ich habe -O2 Ich benutze STM32F767-144 pin. –

Antwort

3

Sie mischen und passen Dinge zusammen. Jedes Objekt, das nicht explizit mit malloc/calloc/etc instanziiert wird, aber lokal instanziiert wird, nimmt keinen Heap-Speicher an, es wird nur dazu führen, dass der Stack wächst, bis die Variable den Bereich verlässt.

Ihr erstes Beispiel:

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

ist völlig in Ordnung. point wird auf Stapel zugewiesen, es wird nicht mehr Speicher benötigt als der, der zum Speichern benötigt wird, und es wird beim Verlassen des Deklarationsbereichs automatisch freigegeben.

Da in beiden Fällen keine dynamische Zuweisung erfolgt, besteht keine Gefahr, die Umgebung zu verlassen.

+0

Danke für die Antwort! Ich denke, ich werde auch die Codegröße der beiden Methoden testen. Und ich denke, ich bleibe bei der ersten Methode und behalte die Punktvariable für zukünftige Verwendung. –

-1
struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

dieser Punkt Variable leben länger als diese

DrawArc(&(struct MATH_POINT){0,0}, other args); 

seit dem ersten Rahmen der man noch am Leben ist DrawArc nach dem Aufruf, während der zweite, sobald die Funktion zurückkehrt verworfen. (und: Keiner von beiden "klebt", beide haben einen genau definierten Lebenszyklus ;-))

Wenn Sie eine Variable "entfernen" möchten, fügen Sie einen zusätzlichen Bereich hinzu und schließen Sie ihn, wenn Sie ihn nicht benötigen mehr:

#define MANY 10000 
{ 
    struct MATH_POINT removeMe[MANY]; 
    /* work on removeMe while they're alive */ 
    doThings(removeMe, other_stuff); 
} 
/* here removeMe is gone, and the mem can/will be used otherwise */ 
+0

'während der zweite verworfen wird, sobald die Funktion zurückkehrt. 'Nein. Mit einer Funktion wird kein Bereich eingeführt oder beendet. Die Lebensdauer des zusammengesetzten Literals dauert bis zu einer schließenden Klammer im aktuellen Block (der, in dem sich der Funktionsaufruf befindet). – 2501

+0

ähm ... und wann genau sind die Funktionsparameter (falls sie für diesen Aufruf vorübergehend sind) außerhalb des Bereichs? Sobald die Funktion zurückkehrt. Ich habe nicht gesagt, dass ein neuer Bereich eingeführt wurde?!? – Tommylee2k

+0

Ich habe gegen dein Zitat gestritten, was nicht korrekt ist. – 2501

Verwandte Themen