char* und boolean TRUE FALSE in C

Habe ich ein Stück von legacy-code hat char* Funktion Argumente welche für wenn-dann-sonst logischen Ablauf. Zum Beispiel:

void myFunc(char *f_reset) {

     .....
     .....
     if(*f_reset) {//do this;}
     else {//do that;}

}

angenommen, ich rufe myFunc(char *f_reset) aus main()

 void main(void) {
     char r = 0;
     char *f_reset = &r;

     *f_reset = 0;

     myFunc(f_reset);  //Debug and enter this function

  }

Wenn ich versuche, geben Sie die Funktion aufrufen, ich finde heraus, dass *f_reset ist nie ausgewertet, da 0 d.h. falsch - es ist immer wahr, weil es einige Müll -8342345825 oder sowas.

Der Grund, warum es mit char* ist wahrscheinlich, weil in den alten Tagen, boolean nahm mehr Speicher als char *? Einige Sachen, die ich in der Vergangenheit gelesen, in Stackoverflow-posts.

Könnte mir jemand eine dummy-Anleitung für die Beziehung zwischen char* und logischen wahr falsch?

  • Null-literal '0' bewertet nicht auf null/false?
  • Versuchen '\0' oder einfach 0.
  • Nein ist es nicht. Ich verwendet habe, 'H', 'L', 'h', 'l', aber nichts. Wenn Sie schreiben, ein schnelles kleines Programm mit einer if-then-else-basierend auf einer char * und zu Debuggen, wird es zeigen Ihnen die ascii-Zahl, nicht das, was Sie wollen. Frustrierend ist es nicht?
  • Ich bin sicher, dass 0 nicht funktioniert. Ich bin tot sicher.
  • Gut, dann bist du falsch so gut wie tot-sicher sind. char ar[2], *p = ar; *p = 0; if (*p){} else{} wird nicht ausgeführt, wenn-block. *p entspricht false. Alles neben einem full-null-Oktett entspricht true. Vielleicht Entsendung einer echten Probe, die kompiliert und zeigt Ihr problem kann etwas Licht?
  • Ich weiß, ich zeigte es der op.. vielleicht nicht in eine offensichtliche Weise
  • ist der Zweck der Boolesche Auswertung, um zu sehen, wenn das erste Oktett der Daten behoben, indem die übergebenen parameter nicht-null? wenn es so ist, dann tun Sie es richtig. Wenn nicht, dann müssen Sie erklären, was Sie wollen, klarer. wie geschrieben nun, es ist richtig zu prüfen, die ersten char der Speicher angesprochen f_reset, und wenn es nicht null ist, wird der if-block ausgeführt wird. Wenn alles, was Sie tun möchten, übergeben Sie einen boolean-flag, gibt es einen Grund, Sie Vorbeigehen-Adresse? Eine by-value-parameter (int zum Beispiel) scheint es, wäre es eine viel bessere Passform.
  • WhozCraig wenn Sie pass *p als Zeiger-argument jetzt in eine Funktion, werden Sie sehen, dass die *p bewertet -823423847234 oder einige große und schreckliche Zahl, die logisch WAHR und mein reset wird immer WAHR sein! das ist nicht richtig! Und ja, ich bin mit char * weil es von legacy-code geschrieben, vor etwa 15 Jahren. Ich schäme mich, zu verwenden, char * für logisch. Boolean ist das beste Passform für Sie.
  • Sie besser Aussehen wieder. das große haarige Wert, die Sie sprechen, ist nicht *p, seine p. Seine Adresse in der pointer-variable. Die Dereferenzierung dieser Adresse in der if Zustand wird Ihnen die char Wert, die Sie suchen. Wie geschrieben, du bist der code ausgeführt, der else block in myFunc.
  • Ich weiß, was ich meine.... *p dereferenzieren es auf den Wert und p bedeutet, dass die Adresse, wo der Wert liegt. wenn(*p) bedeutet, wenn der Wert adressiert von p ist ein logisches true oder 1. Mein Verständnis von Zeiger-referenzieren und dereferenzieren ist nicht fehlerhaft!
  • Sehen Sie Live. Anscheinend sind Sie. Es sei denn, du bist auf einem system, wo char ist 32bit/64bit, Ihre Beobachtung über den Wert dereferenziert char * fehlt etwas. Was ist das problem??? Wenn das char dass unter dieser Adresse die evals nicht-null, die if block feuert, ansonsten die else block feuert.

InformationsquelleAutor ha9u63ar | 2013-10-10
Schreibe einen Kommentar