Pourquoi devons-nous lancer ce que Malloc retourne?
Question
int length = strlen(src);
char *structSpace = malloc(sizeof(String) + length + 1);
String *string = (String*) structSpace;
int *string = (int*) structSpace;
* J'ai créé une structure appelée String
La solution
Vous n'avez pas. void*
sera implicitement transféré vers tout ce dont vous avez besoin en C. Voir aussi la C FAQ sur la raison pour laquelle vous souhaitez éviter explicitement de consigner le retour de malloc dans C. La réponse de @ Sinan illustre davantage la raison pour laquelle cela a été suivi de manière incohérente.
Autres conseils
Parce que malloc renvoie un pointeur sur void, c’est-à-dire qu’il alloue simplement des morceaux de mémoire, sans tenir compte des données qui y seront stockées. En C ++, votre void renvoyé * ne sera pas implicitement converti en un pointeur de votre type. Dans votre exemple, vous n'avez pas indiqué ce que malloc a renvoyé. Malloc a renvoyé un vide * qui a été implicitement converti en un caractère *, mais sur la ligne suivante, vous ... ok, cela n'a plus beaucoup de sens.
La liste des FAQ C est une ressource précieuse: Pourquoi certains codes transt-ils-ils avec précaution les valeurs renvoyées par malloc au type de pointeur alloué? .
C’est l’un des rares problèmes qui fait de la déclaration & "; C ++ est un sur-ensemble de C &"; pas tout à fait vrai. En C, un pointeur void
peut être implicitement converti en un autre type de pointeur. Cependant, C ++ est un peu plus strict avec la sécurité de type, vous devez donc explicitement transtyper la valeur de retour de malloc
vers le type approprié. Généralement, cela ne pose pas vraiment problème, car le code C ++ a tendance à utiliser new
plutôt que <=>, ce qui ne nécessite pas de conversion de type.
En C, le résultat de malloc n'est pas nécessaire et ne doit pas être utilisé. Cela peut, par exemple, masquer l'erreur d'échec de #include <stdlib.h>
, vous n'avez donc pas de prototype pour malloc. Cela peut conduire à d’autres erreurs et à un manque de transférabilité (bien que les pires contrevenants à cet égard soient maintenant pour la plupart obsolètes).
En C ++, vous devez convertir le résultat de malloc pour l'assigner à un pointeur sur un type autre que void. Sauf si vous avez vraiment besoin d'écrire du code pouvant être compilé en C ou C ++, vous devez toutefois éviter l'utilisation de malloc
en C ++ et allouer de la mémoire avec new
.
Vous avez tendance à voir ce genre de code C chez les novices (ou les codeurs C ++ :-)):
int main() {
int len = 40;
char *my_string = (char *) malloc(sizeof(char)*len);
return 0;
}
Ceci est inutile et diabolique, vous pouvez éviter la distribution inutile via notamment stdlib.h
#include <stdlib.h>
int main() {
int len = 40;
char *my_string = malloc(sizeof(char)*len);
return 0;
}
Il est fortement recommandé d’envisager une conversion après l’utilisation de la commande malloc car elle offre une meilleure portabilité et une compatibilité accrue avec d’autres parties de votre programme. Sinon, vous risquez des types de données incompatibles pouvant entraîner des erreurs.