2016-03-09 4 views
0

Je lisais des informations sur memcpy et memmove, et si je ne me trompe pas, vous pouvez utiliser les deux pour déplacer de la mémoire entre différents tableaux.memcpy ou memmove entre différents tableaux

Donc, voici ma question: Si je veux concaténer ces objets avec cette méthode.

class List 
{ 
    // Pointer to the beginning. 
    int* vector; 

    // Number of elements, n >= 0 
    int n; 

    // Capacity for new elements. 
    int capacity; 
} 

void concatenateList(List* listToConcatenate) 
{  
    memmove(this->vector + n, listToConcatenate->vector, (listToConcatenate->n)*sizeof(int)); 
} 

Ainsi, à partir "listToConcatenate->vector" qui est beggining, nous allons copier tous les éléments avec de "(listToConcatenate->n)*sizeof(int))", et nous allons le mettre à la fin de l'autre réseau "this->vector + n".

Cela ne devrait-il pas être correct list2.listToConcatenate(&list1);? En supposant, bien sûr, nous avons assez d'espace.

Si ce n'est pas le cas, quelle serait la bonne façon de le faire? Cela pourrait-il être fait avec memcpy?

Merci.

Modifier: Je pense que je dois ajouter que cela ne fonctionne pas sur mon programme. Il ne plante pas, mais semble ne rien faire.

+1

Est-il valide de concaténer une liste avec lui-même? –

+0

Hm ... oui c'est, pourquoi? – Soutuyo

+0

@DavidSchwartz c'est bien même si 'listToConcatenate == this': pas de chevauchement de mémoire. – YSC

Répondre

2

Ok, j'ai trouvé mon erreur.

Oui, vous pouvez le faire avec memmove mais je manqué quelque chose:

void concatenateList(List* listToConcatenate) 
{  
    memmove(this->vector + n, listToConcatenate->vector, (listToConcatenate->n)*sizeof(int)); 
    this->n += listToConcatenate->n; //Mistake here. 
}; 

C'est la raison pour laquelle il n'a pas l'impression quoi que ce soit. Mais ouais, je m'en souviens un peu plus clairement. Merci à tous pour vos réponses.