/ / Tableau des caractères question C ++ - c ++, tableaux, char

Question sur les tableaux de caractères C ++ - c ++, tableaux, char

Existe-t-il une différence entre les deux extraits ci-dessous? L'un est un tableau de caractères, tandis que l'autre est un pointeur de tableau de caractères, mais ils se comportent de la même façon, n'est-ce pas?

Exemple 1:

char * transport_layer_header;
// Memory allocation for char * - allocate memory for a 2 character string
char * transport_layer_header = (char *)malloc(2 * sizeof(char));
sprintf(transport_layer_header,"%d%d",1,2);

Exemple 2:

char transport_layer_header[2];
sprintf(transport_layer_header,"%d%d",1,2);

Réponses:

12 pour la réponse № 1

Oui, il y a une différence. Dans le premier exemple, vous allouez dynamiquement un tableau de caractères à deux éléments sur le tas. Dans le deuxième exemple, vous avez un tableau de caractères local à deux éléments sur la pile.

Dans le premier exemple, puisque vous ne "t free le pointeur renvoyé par malloc, vous avez également une fuite de mémoire.

Ils peuvent souvent être utilisés de la même manière, par exemple en utilisant sprintf comme vous le démontrez, mais ils sont fondamentalement différents sous le capot.


5 pour la réponse № 2

L'autre différence est que votre premier exemple corrompra les données sur le tas, tandis que le second corrompra les données sur la pile. Ni alloue de place pour la fuite


3 pour la réponse № 3

La différence la plus importante, IMO, est que dans la deuxième option, transport_layer_header est un const pointeur (vous ne pouvez pas le faire pointer vers un endroit différent), où comme dans la première option - vous pouvez.

C'est bien sûr en plus des réponses précédentes.


1 pour la réponse № 4

En supposant que vous corrigiez le "pas de place pour le nul"problème, c’est-à-dire allouer 3 octets au lieu de 2, vous n’utiliserez normalement malloc () que si vous avez besoin de mémoire dynamique. Par exemple, si vous ne connaissez pas la taille du tableau, vous pouvez utiliser malloc.

Comme indiqué, si vous malloc () et ne libérez pas la mémoire plus tard, vous avez une fuite de mémoire.

Un dernier point: vous devriez vraiment vérifier la valeur de retour de malloc () pour vous assurer que vous avez la mémoire. Je sais que dans Solaris, malloc () n’échoue jamais (je pense qu’il pourrait s’endormir - une bonne raison de ne pas l’appeler si vous ne voulez pas que votre processus s’endorme, comme indiqué plus haut). échec (c.-à-d. s'il n'y a pas assez de mémoire disponible). [Corrigez-moi si je me trompe.]