warning: l’affectation crée un entier à partir d’un pointeur sans transtypage

Lorsque je déclare un caractère char * sur une chaîne fixe et que je réutilise 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 ="anotherssortingng"; 

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

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 afin qu’il pointe vers une autre chaîne tgt , utilisez src = tgt; .

Lorsque vous écrivez la déclaration

 *src = "anotherssortingng"; 

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

 char otherssortingng[14] = "anotherssortingng"; ... *src = otherssortingng; 

Maintenant, ce qui se passe est un peu plus clair. Le côté gauche, *src , fait référence à un caractère (puisque src est du type pointeur sur caractère), tandis que le côté droit, otherssortingng , fait référence à un pointeur.

Ce n’est pas ssortingctement interdit car vous pouvez stocker l’adresse vers laquelle pointe un pointeur. Cependant, une conversion explicite est normalement utilisée dans ce cas (ce qui n’est pas très courant dans un cas). Le compilateur lance un drapeau rouge parce que votre code ne fait probablement pas ce que vous pensez.

Il me semble que vous essayez d’atsortingbuer 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 de caractères. Vous ne pouvez pas affecter directement des valeurs à une chaîne comme vous essayez de le faire. Au lieu de cela, vous devez utiliser des fonctions telles que strncpy et friends de et utiliser des tableaux de caractères plutôt que des pointeurs de caractères. Si vous souhaitez simplement que le pointeur pointe vers une autre chaîne statique, supprimez le * .

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

 src = "anotherssortingng"; 

puisque le type de src est char * .

Ce que Jérémie a dit, plus le compilateur émet l’avertissement, car la production:

  * src = "anotherssortingng"; 

dit: prend l’adresse de “anotherssortingng” – “anotherssortingng” EST un pointeur de caractère – et stocke ce pointeur indirect via src (* src = …) dans le premier caractère de la chaîne “abcdef …” pourrait être déroutant car il n’y a nulle part dans votre code aucune mention d’un nombre entier: l’avertissement semble absurde. Mais derrière le rideau se cache la règle selon laquelle “int” et “char” sont synonymes en termes de stockage: les deux occupent le même nombre de bits. Le compilateur ne fait pas de distinction lorsqu’il envoie l’avertissement que vous stockez dans un entier. Ce qui, BTW, est parfaitement correct et légal mais probablement pas exactement ce que vous voulez dans ce code.

– pete