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 einfach0
. - 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 angesprochenf_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 mitchar *
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
, seinep
. Seine Adresse in der pointer-variable. Die Dereferenzierung dieser Adresse in derif
Zustand wird Ihnen diechar
Wert, die Sie suchen. Wie geschrieben, du bist der code ausgeführt, derelse
block inmyFunc
. - 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 dereferenziertchar *
fehlt etwas. Was ist das problem??? Wenn daschar
dass unter dieser Adresse die evals nicht-null, dieif
block feuert, ansonsten dieelse
block feuert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C es gibt nicht den Typ "boolean". Die
if
statment evaluete nur intergers, also integer-Wert 0 ist false, alles andere true ist. Diechar
- Typ kann verwendet werden als 8bit integer.Den char-Wert:
entsprechen den ganzzahligen Wert
48
(siehe eine ASCII-Tabelle) und nicht den integer-Wert 0.In Ihrem Beispiel haben Sie einen char-Zeiger. Aber in der if-Anweisung sind Sie nicht der Bewertung der Zeiger, aber Ihren Wert; ja, *f_reset muss
0
(Ganzzahl) werden als falsch ausgewertet.@Sarwan
Ich weiß, aber wenn Sie dann passieren*x
an eine Funktion, wird es immer noch als TRUE ausgewertet wird, ich will, dass es falsch ist.f_reset
variable inmain
ist etwas sinnlos, denn Sie könnten nur pass&r
und mit ihm getan werden. I. e.char r = 0; myFunc(&r);
Aber wie geschrieben, Sie sollte das tun, was Sie wollen, in diesem Fall dieif (*f_reset)
sollte eval false und der else-block treffen sollte.