Lors de la compilation de code accédant à une constante d'une structure à utiliser dans malloc code>, je reçois un avertissement de conversion -wsign lors de l'utilisation de GCC -WConversion Sample.c code>: #include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned char *numbers = malloc(500 * 100 * sizeof(unsigned char));
printf("Address of numbers: %p\n", &numbers);
}
3 Réponses :
Vous pouvez modifier votre déclaration de struct pour avoir un const non signé INT code> ou simplement lancer dans un non signé INT code> Le S.Value code> dans le MALLOC () CODE> Fonction, car il nécessite des arguments non signés (même taille_t code> pour être précis).
void *malloc(size_t size);
Le prototype malloc code> n'est pas la raison de l'avertissement.
Dans cette structure la valeur puisque la valeur " L'avertissement est parce que si la valeur est effectivement signée mieux être explicite et utilisez une déclaration qui transmet la signification: p> code> semble avoir tous les mots dans sa déclaration erronée p>
code>" est utilisée comme multiplicateur dans l'appel à masloc code> Cela indiquerait qu'il n'est pas une valeur " générique" / code> "Mais une taille d'une matrice, alors peut-être peut-être mieux être non signé code> - et même taille_t code> tout à fait; et son nom soit quelque chose comme Taille code>, longueur code>. p> -1 < / Code>, en le multipliant par 100 code>, vous obtiendrez -100 code> mais en multipliant par un taille de type code> de type Taille_t < / code>, qui serait converti en taille_t code> et comme résultat que le nombre d'octets alloués serait (taille_max - 100) * 1 code> qui est guère ce que vous souhaiteriez pour. p>
Un problème dans le code est que GCC modifie continuellement quel code fait et ne déclenche pas Pour résoudre ce problème, vous pouvez passer à s.value * 100 code> peut déborder int_max code>, causant un comportement non défini. P>
-Wsign-conversion code> car il a tant de faux positifs, de sorte que vous obtiendrez différents résultats avec différentes versions. p>
S.VALUE * 100UL CODE> (et appuyez sur la taille de (sans signé) code> qui est pire que redondant). Mais pensez à ce qui se passerait si S.Value est très important, vous pouvez envisager de faire un chèque que la valeur n'est pas trop grosse (disons, sous code> Taille_max / 200` au moins!) Avant de faire la multiplication . p>
@Alexf ce n'est pas la raison de l'avertissement