2009-05-28 8 views
0

Je viens de convertir une bibliothèque Objective-C en une bibliothèque C dans l'espoir de la rendre multi-plateforme. Cependant, tout semble bien se passer jusqu'à ce que j'envoie cette chose pour être traitée.La chaîne mallocée contient des valeurs parasites

C'est au moment où j'obtiens une erreur.

En repensant à quelques révisions, j'ai remarqué quelque chose dans le débogueur.

Juste après une chaîne malloc'd comme ceci:

char *theString = malloc(SOME_SIZE * sizeof(char)); 

Je verrais que theString est \ x03 et * theString est "3 '\ 003'". J'ai supposé d'abord que c'était juste une mémoire bizarre puisque je n'avais pas enfilé de strcat ou quoi que ce soit, mais que des caractères de départ étranges passaient, et revenaient à chaque autre point que j'effectuais un même malloc. .

En termes de traitement normal, c'est correct. Malheureusement, je ne comprends pas ce que c'est, sinon, je ferais juste quelque chose de radical comme couper ce premier personnage ou quelque chose comme ça. Est-ce que quelqu'un peut m'expliquer ce que c'est et comment je m'en occupe si je veux le convertir en NSString en toute sécurité?

Répondre

9

La valeur renvoyée par malloc n'est pas garantie d'être définie sur une valeur spécifique. Il est seulement garanti de pointer vers la mémoire que vous possédez de longueur au moins aussi longtemps que vous avez spécifié. Si vous voulez que la mémoire soit initialisée, vous devrez le faire vous-même. Ou utilisez alternativement calloc qui mettra à zéro la mémoire.

+1

Notez que calloc ne doit pas être utilisé sauf si nécessaire (par exemple pour les structures ou les tableaux). –

+1

Pouvez-vous élaborer à ce sujet? Je suppose que vous voulez dire qu'un pointeur sur un seul élément ne doit pas utiliser calloc (comme dans, pour les types intégrés)? – Sam

+0

La réduction à zéro est potentiellement coûteuse. En outre, j'ai vu des choses étranges se produire lors de l'utilisation de calloc() avant, qui ont toutes été résolues en passant à l'utilisation de malloc() suivi de bzero(). –

Questions connexes