Est-ce la bonne façon d'attribuer la mémoire à un caractère *.
char* sides ="5"; char* tempSides; tempSides = (char*)malloc(strlen(inSides) * sizeof(char));
7 Réponses :
presque. Les chaînes sont terminées nulle, vous souhaitez probablement allouer un octet supplémentaire pour stocker l'octet nul. C'est, même si Donc, ce serait: p> et si vous voulez le copier dans: p> côtés code> est de 1 caractère long, il est vraiment 2 octets: {
5 code>,
'\ 0' code>}.
Vous voulez dire '\ 0' quand vous dites null. '\ 0' est nul, pas null.
Notez que la multiplication par Tailleof (Char) code> est inutile;
Taillef (Char) Code> est défini pour être 1.
@CAF: True, mais omission que cela rend plus difficile d'adapter le code à WCHAR_T ou à TCHAR si nécessaire - s'il n'y a pas de multiplications, il y a un risque d'oublier d'en utiliser un.
N'oubliez pas de vérifier NULL avant le Strcpy code>
@shachartooth: Multiplier par Tailleof * Tempsures Code> serait le mieux si vous êtes préoccupé par la commutation sur
wchar_t code> plus tard.
@George Phillips: Strictement parlant, vous voulez dire «caractère null». nul code> est le moniker ASCII pour le caractère null; Le terme «nul» n'apparaît nulle part dans la norme C.
@R Samuel Klatchko: Comment proposez-vous de faire un tel chèque et quelles seraient les conséquences possibles? S'il n'y a pas de \ 0 code> après l'entrée,
strallen () code> et
Strcpy code> échouerait de la même manière que votre vérification proposée.
@Msalters: Il voulait dire vérifier la valeur de retour code> MALLOC CODE>.
J'utiliserais strncpy code> au lieu de
strcpy code>. Dans ce cas, nous savons que le tampon est assez grand, alors
Strcpy code> est ok. Cependant, je préfère éviter
Strcpy code> dans tous les cas. Les frais généraux sont si minuscules que vous êtes peu susceptibles de voir une réelle différence de performance.
Il y a un problème avec ça. Tempsures pointera sur un bloc de mémoire de taille ininitialisée 1. Si vous souhaitez copier la chaîne des côtes en Tempsures, vous devrez également affecter une taille d'un octet plus longtemps, afin de maintenir le terminateur zéro pour la chaîne. La valeur renvoyée par SHLEN () n'inclut pas le terminateur zéro à la fin de la chaîne. P>
Non, pas vraiment. Comme d'autres l'ont déjà noté, vous devez attribuer de l'espace pour le terminateur Nul.
En outre, vous devez généralement pas em> jeter le retour du Enfin, chaque appel à MALLOC code>. Il peut couvrir un bogue où vous avez oublié
#include code> l'en-tête correct. Multiplier par
Tailleof (Char) code> est également inutile, car les normes (C et C ++) définissent
Tailleof (char) code> pour toujours être 1. P>
MALLOC code> devrait inclure un test du résultat. Je serra dans une fonction dans une fonction: p>
Comme il a été souligné, vous avez manqué un espace alloué pour la terminaison Nul Chararacter. Mais je voulais aussi signaler quelques autres choses qui peuvent rendre votre code plus concis.
Par définition, Tailleof (Char) code> est toujours 1, vous pouvez donc raccourcir votre ligne d'allocation à: P>
tempSides = strdup(inSides);
Notez que:
Char * Code>; LI>
ol> afin que ce soit: p> xxx pré> toujours, si vous voulez dupliquer em> le contenu de INSIESIDE Code>, vous pouvez utiliser STRUP code>, par exemple: p> xxx pré> p>
multiplier le nombre d'éléments par bien sûr, lorsque vous travaillez avec des chaînes à terminaison zéro, vous devez vous rappeler d'allouer de l'espace supplémentaire pour le caractère zéro terminateur . Il n'ya aucun moyen de dire si votre intention de faire Tailleof (Char) code> est une question de préférence personnelle, car
Tailleof (Char) code> est toujours 1. Toutefois, si vous le faites pour la cohérence , mieux utiliser le type de pointeur du destinataire pour déterminer la taille de l'élément, au lieu de spécifier de type explicitement. Et ne jetez pas le résultat de
MALLOC code>
Tempsides code> une chaîne terminée zéro dans ce cas, je ne peux donc pas dire si vous en avez besoin. P> P>
Certainement pas? Il est préférable d'utiliser des chaînes à terminaison zéro lors de l'appelant SHLEN code> ... S'il utilise sa propre chaleur, je ne veux vraiment pas être le programmateur de maintenance après lui. ;)
@Secure: cela signifie que si INSIDE code> est terminé de zéro. Il n'y a aucune indication dans le code que
Tempsides code> devrait également être terminé de zéro.
La bonne façon de répartition de la mémoire dynamique à Tempsides code> est indiquée ci-dessous:
tempSides = NULL;
@brickner Qu'en est-il de cela à Strlen, Strlen (Inside) + 1