2016-11-12 1 views
0
typedef unsigned char *byte_pointer; 
void show_bytes(byte_pointer start, size_t len) { 
    size_t i; 
    for (i = 0; i < len; i++) 
     printf(" %.2x", start[i]); //line:data:show_bytes_printf 
    printf("\n"); 
} 

void show_integer(int* p,size_t len){ 
    size_t i; 
    for(i=0;i<len;i++){ 
     printf(" %d",p[i]); 
    } 
    printf("\n"); 
} 

Supposons que j'ai deux fonctions ci-dessus, et j'utilise la fonction principale pour tester mes fonctions:Quelle est la différence entre ces deux fonctions C en termes de gestion de la mémoire?

int main(int argc, char *argv[]) 
{ 
    int a[5]={12345,123,23,45,1}; 
    show_bytes((byte_pointer)a,sizeof(a)); 
    show_integer(a,5); 
} 

Je suis les résultats suivants dans mon terminal:

[email protected]:~/OS_project$ ./show_bytes 
39 30 00 00 7b 00 00 00 17 00 00 00 2d 00 00 00 01 00 00 00 
12345 123 23 45 1 

Quelqu'un peut-il me dire pourquoi J'ai eu le résultat? Je comprends la deuxième fonction, mais je ne sais pas pourquoi j'ai obtenu 39 30 00 00 7b 00 00 00 17 00 00 00 2d 00 00 00 01 00 00 00 pour la première fonction. En fait, je sais que la séquence numérique ci-dessus est hexadécimal décimal pour 12345, 123, 23, 45, 1. Cependant, je n'ai aucune idée: pointeur start[i] ne pointe pas sur le nombre entier tel que 12345 ou 123 dans la première fonction. Au lieu de cela, le start[0] pointe juste sur le chiffre le moins significatif pour le premier numéro 12345? Quelqu'un peut-il m'aider à expliquer pourquoi ces deux fonctions sont différentes?

Répondre

2

12345 est 0x3039 en hexadécimal. parce que int est 32 bits sur votre machine, il sera représenté par 0x00003039. Puis, parce que votre machine est petit boutiste, elle sera représentée par 0x39300000. vous pouvez en savoir plus sur Big et Little endian sur: https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html

la même chose s'applique pour d'autres résultats.

+0

mais pourquoi ce byte_pointer ne pointe que vers des chiffres de 0x00003039 tels que 00 ou 39, pourquoi n'a-t-il pas pointer sur le nombre entier 0x00003039? dans la deuxième fonction p [i] fait référence au nombre entier 12345, mais dans la première fonction, start [i] ne fait référence qu'à 00 ou 39 au lieu du nombre entier 0x00003039 (12345) – user144600

+0

parce que vous l'avez lu byte en premier un, et lire entier int dans le second, un int est de 4 octets (sur votre machine) –

2

Sur votre plate-forme, sizeof(int) est 4 et votre plate-forme utilise peu de système endian. La représentation binaire de 12345 en utilisant une représentation de 32 bits est la suivante:

00000000 00000000 00110000 00111001 

Dans un petit système endian, qui est capturée en utilisant la séquence d'octet suivant.

00111001 00110000 00000000 00000000 

Dans hex, ces octets sont:

39 30 00 00 

C'est ce que vous voyez que la sortie correspondant au premier numéro.

Vous pouvez effectuer un traitement similaire des autres nombres du tableau pour comprendre la sortie qui leur correspond.