2015-12-19 2 views
0

Je souhaite copier les bits d'un void * vers un autre void *.Affectation du pointeur vide à un autre pointeur vide

Comment puis-je le faire?

J'ai essayé ceci:

static void* copyBlock(void* ptr) { 
    if (!ptr) { 
     return NULL; 
    } 
    int sizeOfBlock=*(int*)ptr+13; 
    void* copy = malloc(sizeOfBlock); 
    if (!copy) { 
     return NULL; 
    } 
    for(int i=0;i<sizeOfBlock;i++){ 
     *(copy+i)=*(ptr+i); 
    } 
    return copy; 
} 

mais je reçois: invalid use of void expression

+0

Il suffit d'utiliser 'memcpy tourbière standard (3)' – vonbrand

Répondre

1

Cette conception (stockage taille de bloc à l'intérieur d'un bloc sans struct) me semble dangereux, mais je sais toujours la réponse.

*(copy+i)=*(ptr+i); 

Ici, vous obtenez l'erreur, car vous ne pouvez pas déréférencer un pointeur vide. Vous devez le lancer pour pointer vers quelque chose avant. Comme ceci:

((char *)copy)[i] = ((char *)ptr)[i]; 
+0

mais je ne sais pas qui les données stockées dans le bloc. Il peut être int par exemple. Alors, comment puis-je le déréférencer à char *? –

+0

@OhadShamir Vous pouvez toujours convertir n'importe quel pointeur de données en pointeur char et le déréférencer. Pensez-y, char est toujours un seul octet. Vous ne pouvez pas affecter * mysterious void * en C, vous pouvez assigner des octets et d'autres types. – HolyBlackCat

0

Vous devez utiliser la fonction memcpy:

memcpy(copy, ptr, sizeOfBlock); 

En fonction des paramètres du compilateur (vous pouvez compilerons en C++ et non comme C), vous devrez peut-être de jeter les pointeurs vers un pointeur char:

memcpy((char *) copy, (const char *) ptr, sizeOfBlock); 

note: le paramètre de la fonction doit être const char *ptr, pour vous assurer de ne pas modifier le contenu de ptr par erreur.

+2

Aucun compilateur C conforme n'exigera de lancer les arguments sur 'memcpy'. (C++ fait, mais la question est marquée C.) –

+0

True. J'ai ajouté ce commentaire au cas où il parlerait de C dans un environnement C++. Vous ne savez jamais ... –

+0

Que voulez-vous dire par "C dans un environnement C++"? Si vous parlez de compatibilité C++ (et à mon humble avis, il n'y a pas de véritable raison), vous devriez le mentionner dans votre réponse. Mais il n'est pas nécessaire de répondre aux restrictions C++ lors de l'écriture du code C, sauf dans les * rares * cas où vous avez besoin de votre code pour compiler à la fois en C et en C++. –

3

Vous ne pouvez pas déréférencer, exécuter l'arithmétique du pointeur, indexer un pointeur vide car il n'a pas de type de base ou de taille d'objet. Vous devez donc placer le pointeur vide sur le pointeur a du type des unités de données que vous copiez afin que le compilateur connaisse la taille des données à copier.

Cela dit, vous seriez mieux d'utiliser:

memcpy(copy, prt, sizeOfBlock) ;