2015-12-13 3 views
0

Je tente de copier un caractère d'un tableau vers un pointeur de caractère au moyen d'une fonction. À la suite de mon code:memcpy copie un objet tableau vers un pointeur de caractère en C mais pas l'inverse

#include<stdio.h> 
void pass(void* arg){ 
    char arr[1]; 
    arr[0]='X'; 
    memcpy((char *)arg,arr,1); 
} 

void main(){ 
    char *buf=malloc(sizeof(char)); 
    pass(buf); 
    printf("%c",buf); 
    free(buf); 
} 

Ici, le pointeur buf imprime une valeur de déchets. J'ai essayé l'inverse du programme ci-dessus comme suit:

#include<stdio.h> 
void pass(void* arg){ 
    char arr[1]; 
    memcpy(arr,(char *)arg,1); 
    printf("%c",arr[0]); 
} 

void main(){ 
    char *buf=malloc(sizeof(char)); 
    buf[0]='X'; 
    pass(buf); 
    free(buf); 
} 

Ce fut un succès et arr [0] imprime la valeur en tant que X. Quelqu'un pourrait-il expliquer pourquoi le premier cas échouent?

+1

Tournez le bouton d'avertissement d'un cran. –

Répondre

3

Vous devez imprimer *buf ou buf[0] au lieu de buf pour imprimer le premier élément du tableau pointé par buf.

Notez également que les données passant type ayant char* à imprimer via %c dans printf(), qui attendent des données ayant le type int, est un comportement non défini en raison de non-concordance de type.

Essayez ceci:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
void pass(void* arg){ 
    char arr[1]; 
    arr[0]='X'; 
    memcpy((char *)arg,arr,1); 
} 
int main(void){ 
    char *buf=malloc(sizeof(char)); 
    pass(buf); 
    printf("%c",buf[0]); 
    free(buf); 
    return 0; 
} 
3

Votre problème est ici:

char *buf=malloc(sizeof(char)); 
: 
printf("%c",buf); 

parce buf est un pointeur à un personnage, pas un personnage. Le caractère est *buf ou buf[0] donc vous pouvez le fixer avec:

printf ("%c", *buf); 

En aparté, il est totalement inutile de créer arr et appeler memcpy dans le premier exemple quand vous pouvez simplement faire:

L'allocation de mémoire dynamique pour un caractère dans ce cas est également inutile lorsque vous pouvez simplement remplacer la ligne malloc avec un simple:

char buf[1]; 

(et de se débarrasser de la ligne free, bien sûr).