Lors de la réception de données via une prise avec Recv. , j'ai remarqué que, avec: i reçoit p> mesgx��� p>
BlockQuote> "Mesg" étant ce que j'ai envoyé, avec des caractères aléatoires ajoutés. p> si j'utilise p> à la place, je reçois p> mesg p>
blockQuote> 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? P> p>
4 Réponses :
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. P>
L'appel à Dans le cas où vous avez alloué 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. P> MALLOC (4) code> 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. P>
tampon de char [4] code> sur la pile, l'octet suivant est arrivé à être un
'x' code> suivi de quelques autres trucs, donc votre la chaîne vient de continuer jusqu'à ce qu'il ait trouvé le prochain octet nul. p>
Vous ne pouvez pas avoir reçu plus de 4 Je soupçonne que le problème est que vous ne faites pas attention à la sortie 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.
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);
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. p>
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 (). P>