Susann schrieb:> Was genau passiert da eigentlich?
__ctors_end stellt den Stapelzeiger ein
__do_copy_data kopiert initialte Werte für Variablen vom Flash Speicher
ins RAM
__do_clear_bss löscht den Speicher aller anderen Variablen.
__bad_interrupt Wird für alle Interrupts verwendet, denen du keine
eigene Funktion zugewiesen hast.
Bei C++ kommt noch ein Block hinzu, der von allen statischen Objekten
den Konstruktor aufruft.
Stefanus F. schrieb:> Susann schrieb:>> Was genau passiert da eigentlich?>> __ctors_end stellt den Stapelzeiger ein>> __do_copy_data kopiert initialte Werte für Variablen vom Flash Speicher> ins RAM>> __do_clear_bss löscht den Speicher aller anderen Variablen.>> __bad_interrupt Wird für alle Interrupts verwendet, denen du keine> eigene Funktion zugewiesen hast.>> Bei C++ kommt noch ein Block hinzu, der von allen statischen Objekten> den Konstruktor aufruft.
Heißt das, dass alles vorweg auf Null oder so gesetzt wird, ohne dass
ich dafür in meinem Programm etwas tun muß?
Susann schrieb:> Heißt das, dass alles vorweg auf Null oder so gesetzt wird, ohne dass> ich dafür in meinem Programm etwas tun muß?
In C (und C++) werden alle globalen und statischen Variablen mit
Integer-Typ, welche nicht explizit initialisiert sind, auf 0 gesetzt.
Dies ist vom Standard gefordert und wird hier eben von der avr-libc
durch eine Schleife so umgesetzt. Das heißt, dass du globale/statische
Variablen nicht auf 0 setzen musst. Lokale nicht-statische Variablen
werden allerdings standardmäßig gar nicht initialisiert, da musst du
immer einen Wert vorgeben.
1
intfoo;// Wird auf 0 gesetzt
2
intfoo=0;// Wird auf 0 gesetzt
3
intbar=42;// Wird auf 42 gesetzt
4
5
intmain(){
6
intblub=21;// Wird auf 21 gesetzt
7
staticintblar=77;// Wird auf 77 gesetzt
8
staticintfasel;// Wird auf 0 gesetzt
9
intblab;// Wird nicht initialisiert - es muss vor dem ersten Lesen ein Wert zugewiesen werden!
10
}
Die Konstruktoren von C++-Objekten werden allerdings immer aufgerufen
(außer in unions).
Susann schrieb:> Heißt das, dass alles vorweg auf Null oder so gesetzt wird, ohne dass> ich dafür in meinem Programm etwas tun muß?
Jein.
Globale Variablen sind 0, wenn du keinen anderen Startwert vorgibst:
1
#include<avr/io.h>
2
3
inti;
4
intj=3;
5
6
intmain()
7
{
8
intk;
9
printf("i=%d j=%d k=%d",i,j,k);
10
}
i Startet mit dem Wert 0.
j Startet wird dem Wert 3 (der Startwert wird aus dem Flash kopiert).
k Hat keinen definierten Startwert, da kann ein Zufallswert drin stehen.
Merke:
Globale Variablen werden immer mit 0 oder einem angegebenen Startwert
initialisiert.
Lokale Variablen werden hingegen nur dann initialisiert, wenn du es
ausdrücklich hin schreibt.
Noch eine Kleinigkeit: Variablen in Funktionen werden durch denn Code
der Funktion bei jedem Aufruf initialisiert. Es sei denn, da steht das
Schlüsselwort "static" vor, denn dann ist es technisch gesehen eine
globale Variable, die allerdings nur innerhalb der Funktion genutzt
werden darf.
Nachtrag:
Niklas hat mich überholt.
> In C (und C++) werden alle globalen und statischen Variablen mit> Integer-Typ, welche nicht explizit initialisiert sind, auf 0 gesetzt.
Ich glaube, das trifft sogar auf alle Typen zu, nicht nur Integer.
Stefanus F. schrieb:> Ich glaube, das trifft sogar auf alle Typen zu, nicht nur Integer.
wieso glaubst du, ich denke du bist Informatiker und nicht Kleriker?
Was ist mit Pointer?
Im Zweifel lieber initialisieren!
Joachim B. schrieb:> Was ist mit Pointer?>> Im Zweifel lieber initialisieren!
Ich als Informatiker habe meine überlegenen Google-Skills genutzt um es
nachzuschauen:
https://en.cppreference.com/w/cpp/language/zero_initialization
"A zero-initialized pointer is the null pointer value of its type, even
if the value of the null pointer is not integral zero."
Zeiger werden automatisch also als Null-Zeiger initialisiert. Die
manuelle Initialisierung ist also unnötig.
Niklas G. schrieb:> A zero-initialized pointer is
hmmm, Juristendenglish?
ist der "zero-initialized pointer" nun mit zero initialisiert oder ist
er uninitialisiert?
ich bleibe dabei, wer sicher sein will
Joachim B. schrieb:> Im Zweifel lieber SELBER initialisieren!
Joachim B. schrieb:> hmmm, Juristendenglish?
Sprachstandards sind ziemliches Juristenenglisch, ja - sie müssen
schließlich präzise sein.
Joachim B. schrieb:> ich bleibe dabei, wer sicher sein will
Es ist trotzdem unnötig.
Im C++ Standard (N4659 Draft) heißt es in Kap 11.6:
To zero-initialize an object [...] of type T means:
(6.1) — if T is a scalar type (6.9), the object is initialized to the
value obtained by converting the integer literal 0 (zero) to T - 104
In Fußnote 104:
104) As specified in 7.11, converting an integer literal whose value is
0 to a pointer type results in a null pointer value.
In Kapitel 6.9:
[...] pointer types, pointer to member types (6.9.2), std::nullptr_-
t, and cv-qualified (6.9.3) versions of these types are collectively
called scalar types.
Joachim B. schrieb:> ist der "zero-initialized pointer" nun mit zero initialisiert
Ja.