avertissement: attribution de fait de nombre entier à partir de pointeur sans un casting
Lorsque je déclare un char *
à une chaîne fixe et de réutiliser le pointeur sur 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 procéder à une refonte du pointeur, mais sans succès.
- Il est déconseillé dans C l'utilisation d'un non-const
char*
de point de constantes de chaîne -- vous devriez changersrc
pour être de typeconst char*
.
Vous devez vous connecter pour publier un commentaire.
L'expression
*src
désigne le premier caractère de la chaîne, et non pas l'ensemble de la chaîne. Pour réaffectersrc
à point à un autre de la chaîne detgt
, utilisezsrc = tgt;
.Lorsque vous écrivez l'instruction
le compilateur voit la constante de chaîne
"abcdefghijklmnop"
comme un tableau. Imaginez que vous avez écrit le code suivant à la place:Maintenant, c'est un peu plus claire de ce qui se passe. La gauche,
*src
, se réfère à unchar
(depuissrc
est de type pointeur verschar
) alors que le côté droit,otherstring
, fait référence à un pointeur.Ce n'est pas strictement interdit, car vous souhaitez stocker l'adresse d'un pointeur pointe. Cependant, un cast explicite est normalement utilisé dans ce cas (qui n'est pas trop commun d'un cas). Le compilateur est en train de jeter un drapeau rouge parce que votre code n'est probablement pas ce que vous pensez qu'elle est.
Il me semble que vous essayez d'affecter une chaîne de caractères. Chaînes de caractères en C ne sont pas des types de données comme ils sont en C++ et qui sont mis en œuvre avec
char
tableaux. Vous ne pouvez pas affecter des valeurs à une chaîne comme vous essayez de faire. Au lieu de cela, vous avez besoin d'utiliser des fonctions commestrncpy
et les amis de<string.h>
et l'utilisationchar
des tableaux au lieu dechar
pointeurs. Si vous voulez simplement le pointeur sur une autre chaîne statique, puis déposez le*
.L'avertissement vient du fait que vous êtes un déréférencement
src
dans le travail. L'expression*src
a typechar
, qui est un type intégral. L'expression"anotherstring"
a typechar [14]
, qui, dans ce contexte particulier est implicitement converti en typechar *
, et sa valeur est l'adresse du premier caractère dans le tableau. Donc, vous vous retrouvez à essayer d'affecter une valeur de type pointeur vers un type intégral, d'où l'avertissement. Déposer les*
de*src
, et il devrait fonctionner comme prévu:puisque le type de
src
estchar *
.Ce que Jérémie a dit, plus le compilateur émet l'avertissement, car la production:
dit: prenez l'adresse de "anotherstring" -- "anotherstring" EST un pointeur de char -- et de stocker le pointeur indirect par src (*src = ... ) dans le premier caractère de la chaîne "abcdef..." L'avertissement peut être déroutant, car il n'est nulle part dans votre code toute mention de tout entier: l'avertissement semble absurde. Mais, hors de la vue derrière le rideau, est la règle que "int" et "char" sont synonymes dans les conditions de stockage: à la fois occuper le même nombre de bits. Le compilateur ne fait pas la différence lorsqu'il émet l'avertissement que vous stockez dans un entier. Qui, d'ailleurs, est parfaitement OK et juridique, mais probablement pas exactement ce que vous voulez dans ce code.
-- pete
int
etchar
n'ont généralement pas le même nombre de bits.char
a généralement été de 8 bits tout au long de l'histoire de C, etint
est assuré d'être au moins 16 ans et est plus susceptible d'être de 32 ou plus. Ils sont à la fois les types intégraux, et, par conséquent, "integer", on entend soit d'eux. C'est un peu surprenant lorsque l' "integer" question consiste en unechar
, cependant.