6
votes

Char Array vs. Pointeur de Char

Lors de la réception de données via une prise avec Recv. , j'ai remarqué que, avec: xxx

i reçoit

mesgx���

"Mesg" étant ce que j'ai envoyé, avec des caractères aléatoires ajoutés.

si j'utilise xxx

à la place, je reçois

mesg

Il n'y a donc pas de choses aléatoires annexées à ma chaîne. J'ai compris que si j'utilise Char [5], cela fonctionne également aussi, mais je ne comprends pas vraiment pourquoi. Malloc (4) alloue-t-il vraiment 5 octets, le cinquième étant un nul?


0 commentaires

4 Réponses :


6
votes

Vous avez besoin de 5 caractères pour être correctement résilié par NULL. La résiliation NULL compte comme une, donc si nous avons besoin n caractères, allouer n + 1. Ou inversement, pour une allocation de n, vous avez N-1 disponible pour votre contenu.


0 commentaires

16
votes

L'appel à MALLOC (4) n'allocie vraiment que quatre octets. C'était juste une coïncidence que le prochain octet d'octets en mémoire est un nul, qui a terminé votre chaîne pour vous.

Dans le cas où vous avez alloué tampon de char [4] sur la pile, l'octet suivant est arrivé à être un 'x' suivi de quelques autres trucs, donc votre la chaîne vient de continuer jusqu'à ce qu'il ait trouvé le prochain octet nul.

Les fonctions de la prise traitent des octets uniquement et ne traitent pas les octets comme des chaînes avec une nul qui traînait ou quelque chose de plus. Vous obtenez exactement ce que vous demandez.


0 commentaires

2
votes

Vous ne pouvez pas avoir reçu plus de 4 char code> S comme indiqué uniquement RECV code> pour un maximum de 4 octets à placer dans votre tampon. Vous devriez vérifier la valeur de retour de RECV code> pour voir combien d'octets étaient réellement renvoyés.

Je soupçonne que le problème est que vous ne faites pas attention à la sortie 4 Char code > S De quelle que soit la routine générant la sortie. Un moyen d'afficher le contenu initial d'une mémoire tampon char code> éventuellement non nulle est ceci. P>

#define MAX_BUF_LEN (512)
char buffer[MAX_BUF_LEN];
ssize_t count = recv(socket, buffer, MAX_BUF_LEN, 0);

if (count > 0)
    printf("%.*s\n", count, buffer);


0 commentaires

3
votes

Je soupçonne que la différence est une coïncidence. Lorsque vous utilisez la mémoire tampon en tant que chaîne, par exemple dans PrintF (), il sera lu au-delà de la limite jusqu'à ce que «\ 0» soit trouvée.

Vous devez utiliser la mémoire tampon [5] ou MALLOC (5) dans les deux cas. Le memset () ne devrait pas être nécessaire, mieux mettre un tampon [4] = '\ 0' après le RECV ().


0 commentaires