web-dev-qa-db-fra.com

avertissement: l'affectation rend entier à partir d'un pointeur sans transtypage

Lorsque je déclare un char * vers une chaîne fixe et réutiliser le pointeur pour pointer vers une autre chaîne

/* initial declaration */
char *src = "abcdefghijklmnop";
.....

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

J'ai essayé de refondre le pointeur mais sans succès.

25
lcutler

L'expression *src fait référence au premier caractère de la chaîne, pas à la chaîne entière. Pour réaffecter src pour pointer vers une autre chaîne tgt, utilisez src = tgt;.

31
Jeremiah Willcock

Lorsque vous écrivez la déclaration

*src = "anotherstring";

le compilateur voit la chaîne constante "abcdefghijklmnop" comme un tableau. Imaginez que vous aviez écrit le code suivant à la place:

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

Maintenant, c'est un peu plus clair ce qui se passe. Le côté gauche, *src, fait référence à un char (puisque src est de type pointeur vers -char) tandis que le côté droit, otherstring, fait référence à un pointeur.

Ce n'est pas strictement interdit car vous souhaiterez peut-être stocker l'adresse vers laquelle pointe un pointeur. Cependant, une distribution explicite est normalement utilisée dans ce cas (ce qui n'est pas trop courant dans un cas). Le compilateur lance un drapeau rouge parce que votre code ne fait probablement pas ce que vous pensez qu'il est.

Il me semble que vous essayez d'attribuer une chaîne. Les chaînes en C ne sont pas des types de données comme elles le sont en C++ et sont plutôt implémentées avec des tableaux char. Vous ne pouvez pas attribuer directement des valeurs à une chaîne comme vous essayez de le faire. À la place, vous devez utiliser des fonctions comme strncpy et des amis de <string.h> et utilisez les tableaux char au lieu des pointeurs char. Si vous souhaitez simplement que le pointeur pointe vers une autre chaîne statique, supprimez le *.

29
bta

L'avertissement vient du fait que vous déréférencer src dans l'affectation. L'expression *src a le type char, qui est un type intégral. L'expression "anotherstring" a le type char [14], qui dans ce contexte particulier est implicitement converti en type char *, et sa valeur est l'adresse du premier caractère du tableau. Ainsi, vous finissez par essayer d'attribuer une valeur de pointeur à un type intégral, d'où l'avertissement. Jeter le * de *src, et cela devrait fonctionner comme prévu:

src = "anotherstring";

puisque le type de src est char *.

5
John Bode

Ce que Jeremiah a dit, plus le compilateur émet l'avertissement parce que la production:

*src ="anotherstring";

dit: prendre l'adresse de "anotherstring" - "anotherstring" IS un pointeur de caractère - et stocker ce pointeur indirect via src (* src = ...) dans le premier caractère du chaîne "abcdef ..." L'avertissement peut être déroutant car il n'y a nulle part dans votre code aucune mention d'un entier: l'avertissement semble absurde. Mais, hors de vue derrière le rideau, est la règle que "int" et "char" sont synonymes en termes de stockage: les deux occupent le même nombre de bits. Le compilateur ne différencie pas lorsqu'il émet l'avertissement que vous stockez dans un entier. Ce qui, BTW, est parfaitement OK et légal mais probablement pas exactement ce que vous voulez dans ce code.

- pete

0
Pete Wilson