2010-06-01 20 views
4

J'ai un tableau, mais je n'ai pas besoin de sa première (ou dernière) position. Je pointe donc une nouvelle variable vers le reste du tableau, mais je devrais libérer la première/dernière position du tableau. Par exemple:En C, est-il possible de ne libérer qu'un premier tableau ou une dernière position?

p = read_csv_file(); 
q = p + 1; // I don't need the first CSV file field 
// Here I'd like to free only the first position of p 
return q; 

Sinon, je l'ai à memcpy le tableau à d'autres variables, à l'exception de la première position, puis libérer le tableau original. Comme ceci:

p = read_csv_file(); 
q = (int*) malloc(sizeof(int) * (SOME_SIZE - 1)); 
memcpy(q, p+1, sizeof(int) * (SOME_SIZE - 1)); 
free(p); 
return q; 

Mais alors je vais avoir la surcharge de copier tout le tableau. Est-ce possible de ne libérer qu'une seule position d'un tableau?

+2

En un mot, non, ce n'est pas le cas. –

Répondre

4

Non. Vous ne pouvez que free() un bloc complet obtenu à partir d'un appel à malloc() (ou à l'un des amis de malloc()), et non à un élément de ce bloc. Votre meilleur pari est probablement de laisser le bloc alloué tel quel et d'utiliser simplement un pointeur vers l'élément à l'index un comme si c'était le début du tableau (et d'ignorer le dernier élément). En utilisant memcpy fonctionne si c'est vraiment cela important de libérer les deux éléments.

Vous pouvez également déplacer tous les éléments vers la gauche de un (c'est-à-dire déplacer l'élément à l'index un vers l'index zéro), puis appeler realloc() pour redimensionner le bloc et supprimer les deux derniers éléments. Cependant, ce n'est pas vraiment une bonne idée, car le résultat le plus probable est que (a) l'allocation de tas sous-jacente ne sera pas réellement redimensionnée et que vous aurez déplacé quelque chose sans aucun bénéfice, ou (b) le l'allocation de tas sous-jacente sera redimensionnée et tout sera déplacé une seconde fois.

2

C'est ce que realloc(3) est pour. Pour libérer le premier élément du tableau, je suggère de réviser l'algorithme.