C – Prüfen Sie, ob Integer zugewiesen ist

Lesezeit: 3 Minuten

Wie kann ich feststellen, ob eine Ganzzahl nicht zugewiesen ist?

int i; /* no assignment */

if (/* conditional statement here to check if int i is unassigned or not */) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

  • Dieser Thread enthält einige Diskussionen darüber: stackoverflow.com/questions/473236/…

    – Laserallan

    4. August 2009 um 9:34 Uhr

Benutzer-Avatar
Binäre Besorgnis

Du kannst nicht. Es wird “undefinierten” Inhalt haben, was bedeutet, dass es alles enthält, was sich zu diesem Zeitpunkt an diesem Speicherort befindet.

. . . Wenn i nicht im globalen Gültigkeitsbereich deklariert ist, wird es auf Null initialisiert.

  • @Kenny: “es sei denn, i ist deklariert” ist eigentlich das, was ich sagen wollte, da “i” die Variable ist, über die wir sprechen, danke.

    – Binäre Sorge

    4. August 2009 um 9:38 Uhr

  • Eigentlich könnte man argumentieren, dass sogar eine statische Variable nicht zugewiesen ist (sie ist natürlich mit Null initialisiert), wenn Sie sie nicht explizit initialisieren.

    anon

    4. August 2009 um 9:48 Uhr

  • @Neil: Du wanderst jetzt in eine Welt der Semantik. JEDER (mich eingeschlossen) weiß, was es bedeutet, einen Wert zuzuweisen. JEDER weiß auch, was es bedeutet, eine Variable zu initialisieren. Fragen Sie jetzt ALLE: “Was ist der Unterschied zwischen Zuweisung und Initialisierung?” und beobachte, wie sie zappeln (mein eigener Kopf fängt jetzt auch an zu schmerzen).

    – Binäre Sorge

    4. August 2009 um 10:33 Uhr

  • Ich nehme deinen Punkt. Aber ich ging davon aus, dass das OP mit “nicht zugewiesen” gemeint war, so etwas wie “habe ich explizit etwas getan, das dieser Variablen einen bekannten Wert gibt”. In diesem Fall sind sowohl statische als auch lokale Variablen, die nicht explizit initialisiert werden, “nicht zugewiesen”.

    anon

    4. August 2009 um 18:05 Uhr

  • @Neil: Das ist wahr, und es ist eine schöne Unterscheidung zwischen den beiden.

    – Binäre Sorge

    5. August 2009 um 7:53 Uhr

C unterstützt dies nicht von Natur aus – genau wie es die Begrenzungsprüfung von Arrays nicht unterstützt. Es ist ein Kompromiss zwischen Geschwindigkeit/Effizienz und Sicherheit.

Im Allgemeinen … initialisieren Sie Ihre Variablen.

Wenn i global oder statisch ist, wird sein Wert sein 0ansonsten kann sein Wert beliebig sein und es gibt keine Möglichkeit herauszufinden, ob es sich um Müll handelt oder nicht.

Es ist sehr einfach. Sie wissen, dass es nicht zugewiesen ist, weil Sie es nicht initialisiert haben.

Möglicherweise können Sie nach Compiler-Warnungen fragen, wenn Sie nicht initialisierte Werte verwenden. Sie sind jedoch nicht ganz zuverlässig – Sie erhalten gelegentlich falsch positive Ergebnisse, wenn der DFA nicht so schlau ist, wie Sie hoffen, und möglicherweise gelegentlich falsch negative Ergebnisse (ich hoffe nicht, aber ich verspreche nichts).

Für GCC:

-Wuninitialized -O1

Wenn Sie Bedingungscode schreiben möchten:

int a = 3;
int b;
int *p = (rand() > RAND_MAX/2) ? &a : &b;
if (is_uninitialized(*p)) // blah

dann hast du Pech. Im Gegensatz zu einigen dynamischen Sprachen hat C kein Konzept von “dem undefinierten Wert”. Wenn eine Variable nicht initialisiert wird, erhält sie keinen speziellen Wert, der später getestet werden kann. Ihr wird überhaupt kein Wert zugewiesen, daher ist nicht definiert, was passiert, wenn Sie die Variable verwenden.

Benutzer-Avatar
Jason Planke

Wie andere angemerkt haben, können Sie kein C-Programm schreiben, das erkennt, ob eine seiner eigenen Variablen nicht initialisiert ist, und Sie sollten sich bemühen sicherzustellen, dass Variablen immer initialisiert werden.

  • Wenn Sie sicherstellen möchten, dass alle Variablen initialisiert werden, ist ein Tool wie z Valgrind kann die Verwendung nicht initialisierter Variablen erkennen dynamischdurch teure Laufzeitanalysen.

  • Wenn Sie sicherstellen möchten, dass private Daten genau einmal initialisiert werden, besteht die übliche Methode darin, sie mit zu schützen

    int i;
    static bool initialized = 0;
    
    ... 
    if (!initialized) {
      initialized = 1;
      i = ... i's initial value ...;
    }
    

Benutzer-Avatar
KIV

Wie bei allen vorherigen Antworten gibt es keine Möglichkeit, dies zur Laufzeit zu erkennen. Allerdings fast jede statisches Codeanalyse-Tool mit warnen Sie vor nicht zugewiesenen Variablen.

1373980cookie-checkC – Prüfen Sie, ob Integer zugewiesen ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy