C: Deklaration und Initialisierung

#7756304
Lesenswert?

Warum dieser Behandlungsunterschied?

1
#include <avr/io.h>
2

3
uint8_t k;
4

5
int main(void)
6
{

(Alles in Ordnung) . . .

1
#include <avr/io.h>
2

3
int main(void)
4
{
5
  uint8_t k;

Warning: 'k' may be used uninitialized in this function [-Wmaybe-uninitialized]

Persönliche Seite #7756374
Lesenswert?

Klaus K. schrieb:

Wenn sie im ersten Schritt beschrieben wird? Dann ist es doch wurscht

Das geht auch, dann wird sie eben "geschrieben" statt "initialisiert" vor dem ersten Auslesen. Allerdings kann der Compiler das manchmal nicht so ganz durchblicken und gibt dann doch die Warnung aus.

Allerdings finde ich es sauberer, die Variable überhaupt erst dann zu deklarieren, wenn man auch einen Wert für sie hat, und sie dann eben damit zu initialisieren. Dann gibt es gar keinen Zeitraum, in welchem man die Variable versehentlich uninitialisiert nutzen kann.

#7756375
Lesenswert?

Niklas G. schrieb:

Harald K. schrieb:

Was sollen "gute Programme" an dieser Stelle anders machen?

Die sollten lokale Variablen initialisieren bevor sie diese nutzen.

Weil in "schlechten" Programmen die nicht initialisierte Variable z.B. als return zurückgegeben wird und in irgendwelchen if /else Gebirgen vergessen wurde ihr einen Wert zuzuweisen. Oder mit der uninitialisierten Variable gerechnet wird.

Persönliche Seite #7756474
Lesenswert?

Niklas G. schrieb:

Lokale Variablen werden hingegen nicht automatisch initialisiert [...]

Zur Präzisierung: Lokale Variablen, die nicht im Static Storage liegen (nicht zur Speicherklasse static gehören) werden nicht automatisch initialisiert falls die keinen Initializer haben.

Daten im Static Storage werden immer initialisiert, egal ob lokal oder global, und auch dann, wenn sie keinen Initializer haben.

#7756798
Lesenswert?

Globale Variablen bekommen halt initial nen Zustand vorgegeben, der ist in dem Fall 0. Funktionen, die auf diese zugreifen, sind ja immer irgendwo nicht reentrant, weil abhängig von etwas, was außerhalb der Funktion liegt (wäre bei ner lokalen static-Variable aber auch so, siehe GetTickCount unter Win).

Ich find's sehr begrüßenswert, dass der Compiler dich auf uninitialisierte Variablen hinweist - zusammen mit dem Prinzip 'Lokal geht vor global' könnte dann fast nen strukturiertes Programmieren mit definierten Funktions-Ein-/Ausgaben möglich werden :)

Moderator Persönliche Seite #7761119
Lesenswert?

Niklas G. schrieb:

Allerdings finde ich es sauberer, die Variable überhaupt erst dann zu deklarieren, wenn man auch einen Wert für sie hat, und sie dann eben damit zu initialisieren.

Hat man nicht immer. Wenn die Zuweisung beispielsweise in mehreren if-Zweigen erfolgt, dann hat man beim Anlegen noch keinen definierten Wert.

Stur einfach immer einen Initialwert reinzuknallen kann Bugs verschleiern, die der Compiler ohne einen solchen Initialwert (als Warnung) aufdecken würde.

Allerdings habe ich auch schon Situationen erlebt, in denen der Compiler nicht nachvollziehen konnte, dass eine Variable wirklich vor Benutzung auch gesetzt worden ist.

#7761146
Lesenswert?

Georg M. schrieb:

Jetzt weiß ich es nicht. Jetzt bin ich verwirrt.

Dann poste halt Deinen Code. Entweder nutzt Du dort k und das Ergebnis ist (vermutlich) anders als erwartet. Oder Du nutzt k nicht, dann lass k weg.

Georg M. schrieb:

Erst mit "uint8_t k = 0;" funktioniert das Programm richtig.

eine andere Möglichkeit ist "static uint8_t k;". Dann wird es (wie eine globale Variable) vor dem ersten Aufruf mit 0 initialisiert, ist aber nur innerhalb der {} direkt verwendbar.

Dabei gibt

es aber nur "int main(void)", sonst nichts, keine weiteren Funktionen.

Für den C-Compiler ist main nicht unbedingt eine besondere Funktion. main kann prinzipiell auch mehrfach aufgerufen werden. Es ist relativ egal, wo Du das Konstrukt verwendest.

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