Supprimer les éléments de tableaux dynamiques

Donc, j'ai ceci:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void remove_element(int* array, int sizeOfArray, int indexToRemove)
{
    int* temp = malloc((sizeOfArray - 1) * sizeof(int*)); //allocate an array with a size 1 less than the current one
    memcpy(temp, array, indexToRemove - 1); //copy everything BEFORE the index
    memcpy(temp+(indexToRemove * sizeof(int*)), temp+((indexToRemove+1) * sizeof(int*)), sizeOfArray - indexToRemove); //copy everything AFTER the index
    free (array);
    array = temp;
}

int main()
{
    int howMany = 20;
    int* test = malloc(howMany * sizeof(int*));


    for (int i = 0; i < howMany; ++i)
        (test[i]) = i;



    printf("%d\n", test[16]);
    remove_element(test, howMany, 16);
    --howMany;
    printf("%d\n", test[16]);
    return 0;
}

Il est raisonnablement à l'auto-explicatif, remove_element supprime un élément d'un tableau dynamique.

Comme vous pouvez le voir, chaque élément de test est initialisé à une incrémentation entier (qui est, d'essai[n] == n). Toutefois, le programme des sorties

16
16

.
Après avoir supprimé un élément de test, on pourrait s'attendre à une appel à à un essai[n] où n >= l'élément supprimé aurait pour résultat de ce test[n+1] aurait été avant la suppression. Donc j'attendrais la sortie

16
17

. Ce qui ne va pas?

EDIT: Le problème a été résolu. Voici le code fixe (brut de débogage printfs), quelqu'un d'autre devrait le trouver utile:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int remove_element(int** array, int sizeOfArray, int indexToRemove)
{
printf("Beginning processing. Array is currently: ");
for (int i = 0; i < sizeOfArray; ++i)
printf("%d ", (*array)[i]);
printf("\n");
int* temp = malloc((sizeOfArray - 1) * sizeof(int)); //allocate an array with a size 1 less than the current one
memmove(
temp,
*array,
(indexToRemove+1)*sizeof(int)); //copy everything BEFORE the index
memmove(
temp+indexToRemove,
(*array)+(indexToRemove+1),
(sizeOfArray - indexToRemove)*sizeof(int)); //copy everything AFTER the index
printf("Processing done. Array is currently: ");
for (int i = 0; i < sizeOfArray - 1; ++i)
printf("%d ", (temp)[i]);
printf("\n");
free (*array);
*array = temp;
return 0;
}
int main()
{
int howMany = 20;
int* test = malloc(howMany * sizeof(int*));
for (int i = 0; i < howMany; ++i)
(test[i]) = i;
printf("%d\n", test[16]);
remove_element(&test, howMany, 14);
--howMany;
printf("%d\n", test[16]);
return 0;
}
Je pense que cnicutar repéré le problème exact, mais s'il vous plaît regardez ma réponse ainsi que pour certains plus importants commentaires.
simplement comme quelque chose à méditer: vous crédité d'une personne qui m'a répondu très rapidement, mais seulement attrapé une erreur dans votre code avec la solution. cependant, il y a une autre personne qui a posté seulement six minutes plus tard, ayant pris six différentes erreurs dans votre code. si vous aviez seulement avaient utilisé la réponse que vous avez donné de crédit, vous disposez d'au moins 5 problèmes importants avec votre code. Si c'était moi, je voudrais donner du crédit à la personne qui a pris son temps et a trouvé toutes les questions dans le code, plutôt que celui qui a posté le plus rapide. [pas de moi, j'étais beaucoup trop lent] just sayin'.
Je pense que vous avez raison. Et effectivement, je pense que votre réponse est la meilleure.

OriginalL'auteur Dataflashsabot | 2011-08-17