waarschuwing: toewijzing maakt een geheel getal van aanwijzer zonder cast

Als ik een char *declareer bij een vaste string en de aanwijzer hergebruik om naar een andere string te verwijzen

/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the   "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";

Ik heb geprobeerd de aanwijzer te herschikken, maar geen succes.


Antwoord 1, autoriteit 100%

Wanneer u de verklaring schrijft

*src = "anotherstring";

de compiler ziet de constante string "abcdefghijklmnop"als een array. Stel je voor dat je in plaats daarvan de volgende code had geschreven:

char otherstring[14] = "anotherstring";
...
*src = otherstring;

Nu is het wat duidelijker wat er aan de hand is. De linkerkant, *src, verwijst naar een char(aangezien src = tgt;van het type pointer-to-char) terwijl de rechterkant, otherstring, verwijst naar een aanwijzer.

Dit is niet strikt verboden omdat je misschien het adres wilt opslaan waarnaar een aanwijzer verwijst. Normaal gesproken wordt in dat geval echter een expliciete cast gebruikt (wat niet zo gebruikelijk is). De compiler geeft een rode vlag omdat uw code waarschijnlijk niet doet wat u denkt dat het is.

Het lijkt me dat je een string probeert toe te wijzen. Strings in C zijn geen datatypes zoals in C++ en worden in plaats daarvan geïmplementeerd met chararrays. U kunt niet direct waarden toewijzen aan een tekenreeks zoals u probeert te doen. In plaats daarvan moet je functies gebruiken zoals strncpyen vrienden van <string.h>en chararrays gebruiken in plaats van charaanwijzers. Als u alleen wilt dat de aanwijzer naar een andere statische tekenreeks wijst, laat u de *vallen.


Antwoord 2, autoriteit 94%

De uitdrukking *srcverwijst naar het eerste teken in de tekenreeks, niet de hele tekenreeks. Gebruik src = tgt;om src = tgt;opnieuw toe te wijzen aan een andere tekenreeks src = tgt;.


Antwoord 3, autoriteit 19%

De waarschuwing komt voort uit het feit dat je de verwijzing naar src = tgt;in de opdracht weghaalt. De uitdrukking *srcheeft het type char, wat een integraal type is. De uitdrukking "anotherstring"heeft het type char [14], dat in deze specifieke context impliciet wordt geconverteerd naar het type char *, en de waarde is het adres van het eerste teken in de array. Dus uiteindelijk probeer je een pointerwaarde toe te wijzen aan een integraal type, vandaar de waarschuwing. Laat de *vallen uit *src, en het zou moeten werken zoals verwacht:

src = "anotherstring";

aangezien het type src = tgt;char *is.


Antwoord 4

Wat Jeremia zei, plus de compiler geeft de waarschuwing omdat de productie:

*src ="anotherstring";

Zegt: neem het adres van “anothersstring” – “Anothothstring” is een char-aanwijzer – en bewaar die aanwijzer indirect via SRC (* SRC = …) in de eerste Char of the String “ABCDEF … “De waarschuwing kan verbluffend zijn omdat er nergens in uw code is vermeld van elk geheel getal: de waarschuwing lijkt onzinnig. Maar uit het zicht achter het gordijn, is de regel dat “int” en “char” synoniem zijn in opslag: beide bezetten hetzelfde aantal bits. De compiler onderscheidt zich niet wanneer het de waarschuwing geeft die u opbergt in een geheel getal. Welke, trouwens, perfect ok en juridisch, maar waarschijnlijk niet precies wat je wilt in deze code.

– Pete

Other episodes