[c] supprimer un tableau - Comment supprimer un tableau en c

Bonjour, dans mon programme, j’ai généré un tableau et j’aimerais le supprimé

mon tableau s’appelle tab

merci de me dire comment faire

nc

Si tu as créé ton tableau statiquement, il sera détruit automatiquement à la fin du bloc d’instruction où il a été créé, c’est à dire à la fin d’une fonction, d’une boucle (for, while…) ou d’une condition(if,else,…).

ex:


void fonction()
{
int tab[10];//creation de tab
...
...
}   //destruction de tab

Il existe évidement des moyens pour que la variable ne soit pas detruite à la fin d’un bloc (static)

Si tu l’as créé dynamiquement avec un pointeur et malloc, il faudra faire un free lorsque tu n’auras plus besoin de l’espace alloué (la variable quoi)

mais en fait la suppression du tableau doit se faire dans la meme fonction que celle de sa création.
en fait, j’ai :

void fonction()
{
int tab[10];//creation de tab


supprimer le tableau
}

Le but de ma suppression de tableau est de pouvoir le refaire plus petit donc je pensais le supprimer et le redéclarer plus petit mais il y a t il une autre solution que la suppression ? (en fait je veux garder les trois derniers nombres du tableau et je ne sais pas trop comment faire)

merci de m’aider

si ton tableau est créé dans la fonction, il sera automatiquement detruit à la fin de la fonction. si tu veux seulment faire de l’affichage, créé un autre tableau de 3 (int tab2[3] ) où stockeras ton resultat :neutre:

Oui, il a une autre solution : la reallocation dynamique :

[cpp]
char * tab = NULL;
in nElement;

nElement = 10;
tab = (char*)malloc(nElement * sizeof(char));
if (NULL == tab)

/* blah … /
nElement = 20;
tab = (char
)realloc((char *)tab, nElement * sizeof(char));
if (NULL == tab)

[/cpp]

Tu ne peux pas réallouer des variables allouées sur la pile :slight_smile: par contre dans le tas (cf. exemple de Kiss) oui. Y a d’ailleurs un truc que j’ai jamais pigé : on m’a toujours conseillé d’éviter realloc() comme la peste, why?

J’estime que si realloc fait partis de la libc c’est que ça a du être validé, je ne fait pas partis de ces gens dit “perfectionniste” (je dirais intégristes) qui troll pour telle ou telle utilisation alors que tel truc est plus mieux, dès lors que je ne sort pas des standards de la libc, le reste m’importe peu.
L’histoire de la pile et du tas, itou, c’est juste qu’en realloc sur la pile, c’est un peu plus lent.

Je ne vois pas pourquoi on n’utiliserait pas realloc() :??:
J’aimerais bien savoir quels sont les arguments contre, c’est une fonction super pratique, et qui marche bien. Ça serait bête de ne pas s’en servir :neutre:

moi g également appris à faire free + malloc à la nouvelle taille souhaitée, je n’ai jamais utilisé cette fonction :neutre:

realloc = free + malloc :slight_smile: (en gros)

Le seul reproche que je ferais à realloc est son problème d’alignement (fragmentation de la mémoire) pour le reste, c’est nickel.

merci de toutes vos réponses, mais pourriez vous m’expliquer clairement comment utiliser toutes ces fonctions

karl t’as fait un exemple avec les allocations dynamiques, appuie toi dessus

Je pense surtout que c’est à cause du cas pignouf :

if ((p = realloc(p, x)) == NULL ) {
  perte de mémoire;
}

Rebonjour a tous,

Je désirerais maintenant que mon tableau qui a pour dimension tab soit accessible à une fonction appelé dans main() :

j’ai la syntaxe suivante :

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

int tab[50];
int bonjour();

int main(void)
{
bonjour(tab);

system("PAUSE");

}

et dans la fonction bonjour :

bonjour©
{
c[1]=20;
printf("%d",c);
return c;

}

cependant le compilateur me signale une erreur, d’avance merci de votre aide

Heu, pas la peine d’ouvrir un nouveau sujet à chaque fois, vu que ça parle globalement de la meme chose, continue dans ton topic précédent.

je combine les 2 sujets :jap:

  1. pour le tableau, colle moi un static devant (static int …) cela évitera que des librairies autres y touche.

  2. Un prototype sans arguments : int bonjour(void); sinon en général ça gueule. Et comme c’est int bonjour(int c[]) ça ne marchera jamais.

  3. ne suppose pas que le type par défaut c’est int. les compilateurs sont aussi variés que nombreux. Mets toujours le type (C-ANSI). -> int bonjour(int c[]).

  4. printf("%d", c[1]); c est un pointeur sur int (int*), et toi tu veux un entier pas un pointeur -> *(c+1) ou c[1].

  5. ouch. On ne renvoie jamais un tableau. D’une part parce que tu ne peux pas, d’autre part parce que c’est un tableau statique (int x[]). Sinon là tu renvoie une adresse, ce qui n’est pas bon (int bonjour(…)). Essaye int* bonjour(…) ça fonctionnera un peu mieux.