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

Était-ce utile?

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.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top