Warnung: Zuweisung macht Integer aus Zeiger ohne Umwandlung

Lesezeit: 3 Minuten

Benutzeravatar von lcutler
lcutler

Wenn ich a erkläre char * auf eine feste Zeichenfolge und verwenden Sie den Zeiger erneut, um auf eine andere Zeichenfolge zu zeigen

/* initial declaration */
char *src = "https://stackoverflow.com/questions/5122231/abcdefghijklmnop";
.....

/* I get the   "warning: assignment makes integer from pointer without a cast" */
*src ="https://stackoverflow.com/questions/5122231/anotherstring";

Ich habe versucht, den Zeiger neu zu formulieren, aber ohne Erfolg.

  • Es ist in C veraltet, eine Nicht-Konstante zu verwenden char* auf String-Konstanten zeigen – Sie sollten sich ändern src Typ sein const char*.

    – Adam Rosenfield

    25. Februar 2011 um 20:42 Uhr

Der Ausdruck *src bezieht sich auf das erste Zeichen in der Zeichenfolge, nicht auf die gesamte Zeichenfolge. Um neu zuzuweisen src auf eine andere Zeichenfolge zeigen tgtverwenden src = tgt;.

Wenn Sie die Erklärung schreiben

*src = "https://stackoverflow.com/questions/5122231/anotherstring";

der Compiler sieht die konstante Zeichenfolge "https://stackoverflow.com/questions/5122231/abcdefghijklmnop" wie ein Array. Stellen Sie sich vor, Sie hätten stattdessen folgenden Code geschrieben:

char otherstring[14] = "https://stackoverflow.com/questions/5122231/anotherstring";
...
*src = otherstring;

Jetzt ist es etwas klarer, was los ist. Die linke Seite, *srcbezieht sich auf a char (seit src ist vom Typ Zeiger-auf-char) während die rechte Seite, otherstringbezieht sich auf einen Zeiger.

Dies ist nicht streng verboten, da Sie möglicherweise die Adresse speichern möchten, auf die ein Zeiger zeigt. In diesem Fall wird jedoch normalerweise eine explizite Umwandlung verwendet (was nicht allzu häufig vorkommt). Der Compiler wirft eine rote Flagge aus, weil Ihr Code wahrscheinlich nicht das tut, was Sie denken.

Es scheint mir, dass Sie versuchen, eine Zeichenfolge zuzuweisen. Strings in C sind keine Datentypen wie in C++ und werden stattdessen mit implementiert char Arrays. Sie können einer Zeichenfolge nicht direkt Werte zuweisen, wie Sie es versuchen. Stattdessen müssen Sie Funktionen wie verwenden strncpy und Freunde aus <string.h> und verwenden char Arrays statt char Zeiger. Wenn Sie nur möchten, dass der Zeiger auf eine andere statische Zeichenfolge zeigt, löschen Sie die *.

Die Warnung kommt von der Tatsache, dass Sie dereferenzieren src im Auftrag. Der Ausdruck *src Typ hat char, was ein ganzzahliger Typ ist. Der Ausdruck "https://stackoverflow.com/questions/5122231/anotherstring" Typ hat char [14]die in diesem speziellen Kontext implizit in Typ konvertiert wird char *, und sein Wert ist die Adresse des ersten Zeichens im Array. Sie versuchen also, einem ganzzahligen Typ einen Zeigerwert zuzuweisen, daher die Warnung. Lass fallen * aus *srcund es sollte wie erwartet funktionieren:

src = "https://stackoverflow.com/questions/5122231/anotherstring";

seit der Art von src ist char *.

Was Jeremiah gesagt hat, plus der Compiler gibt die Warnung aus, weil die Produktion:

*src ="https://stackoverflow.com/questions/5122231/anotherstring";

sagt: Nehmen Sie die Adresse von “https://stackoverflow.com/questions/5122231/anotherstring” – “https://stackoverflow.com/questions/5122231/anotherstring” IST ein Zeichenzeiger – und speichern Sie diesen Zeiger indirekt durch src (*src = … ) in das erste Zeichen des Strings “abcdef…” Die Warnung könnte verblüffend sein, da in Ihrem Code nirgendwo eine ganze Zahl erwähnt wird: Die Warnung erscheint unsinnig. Aber hinter dem Vorhang gilt die Regel, dass “int” und “char” in Bezug auf die Speicherung synonym sind: Beide belegen die gleiche Anzahl von Bits. Der Compiler unterscheidet nicht, wenn er die Warnung ausgibt, dass Sie in einer Ganzzahl speichern. Was übrigens vollkommen in Ordnung und legal ist, aber wahrscheinlich nicht genau das, was Sie in diesem Code wollen.

– Peter

Struktur des Knotens:-

struct node {
  char key[10];
  struct node *left, *right;
};

Es kann auch eintreffen, wenn Sie so etwas tun

struct node *newNode(char item[10]) {
  struct node *temp = (struct node *)malloc(sizeof(struct node));
  temp->key[10] = item;
  temp->left = temp->right = NULL;
  return temp;
}

In Zeile 3 wird eine Warnung angezeigt und Ihr gesamter Code wird durcheinander gebracht. Gute Nachrichten sind:-

Sie müssen beweisen, dass es sich um ein Array handelt, und es kann einfach durchgeführt werden

temp->key[10] = item[10];

So einfach ist das…

1397430cookie-checkWarnung: Zuweisung macht Integer aus Zeiger ohne Umwandlung

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

Privacy policy