2010-07-17 4 views
1

Avec ces variables:Pourquoi NSLog imprime-t-il un zéro supplémentaire lors de la consignation de ce tableau?

NSInteger dataStart; 
uint64_t dataSize[1]; 
const unsigned char *beginning; 
NSInteger bytesEnd; 

... à ces valeurs:

dataStart = 499 
dataSize[0] = 427 
beginning = 9060864 
bytesEnd = 9061793 

... le code suivant:

NSLog(@"dataStart = %d, dataSize[0] = %d, beginning = %d, bytesEnd = %d", 
     dataStart, dataSize[0], (NSInteger)beginning, bytesEnd); 

... envoie cela à la console:

dataStart = 499, dataSize[0] = 427, beginning = 0, bytesEnd = 9060864 

En d'autres termes, un zéro supplémentaire a été inséré après le tableau, supplantant les autres variables. Cela fait toujours. J'utilise xcode 3.2.3. Que se passe-t-il ici? [Modifier pour souligner: Ce n'est pas seulement l'ancien favori d'imprimer un zéro où une valeur devrait être parce qu'un casting est faux. Il est l'insertion d'un zéro supplémentaire, puis d'imprimer la valeur correcte du début où il doit imprimer bytesEnd, et non l'impression bytesEnd.]

Merci,

Répondre

2

Juste une supposition, mais compilez vous en mode 64 bits? Le pointeur de début est 64 bits dans ce cas, mais NSInteger est 32 bits, de sorte que vous imprimez uniquement les bits 32 bits de poids fort du pointeur qui sont zéro. Je suppose que c'est un exemple inventé parce que personne dans leur bon sens ne pourrait lancer comme ça. Droite?

+0

Il ne s'agit pas simplement d'imprimer une valeur zéro, mais d'ajouter une valeur supplémentaire et de déplacer les autres variables le long d'une valeur. C'est la chose étrange. J'ai fait le mouseover dans le débogueur pour m'assurer que c'est ce que les valeurs étaient. Jeff LaMarche & David Mark :-) (J'essaie d'obtenir leur méthode splitTransferredPackets dans le chapitre 9 de More iPhone 3 Development pour des quantités décentes de données). – DenverCoder9

+0

Bien sûr, cela déplace les autres variables: NSLog suppose que la valeur est de 32 bits, mais elle est de 64 bits, donc elle occupe également l'adresse de la valeur suivante. Si vous compilez en mode 64 bits, vous ne devriez quand même pas lancer de pointeur vers NSInteger. –

+0

Je ne l'ai pas dit de compiler en mode 64 bits, et je suis en train de programmer pour iPhone, donc je ne pense pas que ce serait le cas. Aussi, il se connecte ailleurs bien. Mais cette explication a du sens pour dataSize [0] occupant 2 adresses car il s'agit en effet d'un entier de 64 bits, donc ayez un tick et un upvote :-) – DenverCoder9

1

Vous avez le mauvais sélecteur de format. % d n'est pas suffisant pour imprimer un uint64_t, ce qui est ce que datasize [0] est. Utilisez% ld.

+0

% ld est faux pour 64 bits ints en mode 32 bits. – JeremyP

Questions connexes