2017-01-27 2 views
-4

Ich codiere etwas Kleines, um zu verstehen, wie Zeiger funktionieren und ein Problem erreicht haben. Ich habe ein boolean, auf den „gültig“ in einer Datei namens „main.c“:Wie initialisiert man einen bool Zeiger in C?

bool *valid; 

Die Adresse des Zeigers wird in einer zweiten Datei mit dem Namen „test.c“ an eine Methode übergeben:

method(&valid); 

im Innern der "test.c" Methode I gültig auf true gesetzt:

*valid = true; 

nach dem Methodenaufruf in "main.c" ich dereferenzieren gültig in zwei if-Anweisungen, um zu sehen, ob es wahr oder falsch ist:

if (*valid) { 
    printf("valid is true.\n"); 
} 
if (!(*valid)) { 
    printf("valid is false.\n"); 
} 

Beide Anweisungen drucken, aber nur "gültig ist wahr" sollte. Was könnte das Problem hier sein?

+1

Wenn Sie * valid = true verwenden, möchten Sie den addressof-Operator nicht verwenden, wenn Sie den Zeiger auf method() übergeben. – Omaha

+3

Was sagt Ihr Compiler dazu? – EOF

+6

Die Veröffentlichung eines [minimalen, vollständigen und überprüfbaren Beispiels] (https://stackoverflow.com/help/mcve) würde helfen. Ich bin ziemlich sicher, dass Ihre Compilerwarnungen Ihnen bereits die Antwort sagen. – user3386109

Antwort

1

Wird die Erklärung von valid ist in der Tat ein bool *, dann in der main Funktion, haben Sie etwas zu Punkt, an ein bool ohne zur Vereinbarkeit eines bool selbst erklärt. Bis Sie es initialisieren, wird es zunächst auf einen unvorhersehbaren Speicherort zeigen.

Wenn Sie übergeben diese in method, kompiliert Ihren Code unter der Annahme, method muss eine bool ** werden akzeptieren - einen Zeiger auf einen Zeiger auf bool - so, wenn Sie *valid = true gesetzt, was Sie tatsächlich setzt dabei die bool * Zeiger in die main Methode auf den Wert true, die 0x0000000000000001 ist. Wenn main den Zeiger dereferenziert, liest es Bytes an diesem Speicherort und interpretiert sie als bool. Ein property-formed bool muss entweder 0 oder 1 sein, und der Compiler trifft darauf basierende Annahmen, wenn er Dinge wie den !-Operator auswertet - als solcher kann ein Wert, der weder 0 noch 1 ist, dazu führen, dass diese Annahmen zusammenbrechen. und kann dazu führen, dass sowohl value als auch !value als "wahr" angesehen werden.

Was Sie tun möchten, ist valid als eine Ebene bool in der main Funktion zu deklarieren. Diese Deklaration wird tatsächlich Speicherplatz für einen bool zuweisen, anstatt Speicherplatz Punkt bei ein bool ohne Zuweisen der bool selbst zuzuweisen. Dann akzeptiert method einen bool *, und wenn es *valid = true tut, weist es true dem bool deklariert auf main 's Stapel zu.

+1

Vielen Dank! Das hat mir geholfen! –

+0

Sie sind herzlich willkommen. :-) –

Verwandte Themen