Pour les debutants : allocation dyanamique de memoire pour un tableau a 2 dimesnsions en c (tout compilateur)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 268 fois - Téléchargée 35 fois

Contenu du snippet

Quand j'étais débutant, j"ai eu beaucoup de mal à piger l'allocation dyamique de mémoire; il y en a peut être dans mon cas
, dons j'ai fait un petit tutot à travers un exemple. N'étant pas un pro du C, si des bons détectent une erreur qu'il me le dise

Source / Exemple :


#include <stdio.h> // Fonctions printf et scanf
#include <stdlib.h> // Fonctuions malloc et free
//Erit sous linux, mais devrait macher sur tout les compilateurs
//Code au format ANSI-C
//J'ai volontairement enlev&#65533;les accents pour les diff&#65533;ents systemes d'exploitation
int main()
{
	int **tab; // Futur tableau de type integer a deux dimensions
	int x, y; // Nbr de lignes, nbr de colonnes
	int i, j; // Simples compteurs de boucles
	int taille_int = sizeof(int); // Taille d'un type integer, ou d'un autre type si votre
	//pointeur pointe sun un autre typr par ex. 'char'

	printf ("Entrez le nombre de lignes : ");
	scanf ("%d",&x);

	printf ("Entrez le nombre de colonnes : ");
	scanf ("%d",&y);

	tab = (int**)malloc(taille_int*x); // On alloue dynamiquement la premiere dimension
	//Si votre pointeur est pointe sur un autre type remplacez 'int' par 'char' par exemple

	if (tab == NULL) {
		printf ("Memoire insuffisante.");
		return (1);
	}

	for (i=0; i<x; i++) { // Cette boucle alloue dynamiquement la seconde dimension
    		tab[i] = (int*)malloc(taille_int*y);
	}

	for (i=0; i<x; i++) { // Cette boucle remplie le tebleau
		for (j=0; j<y; j++) {
			tab[i][j] = i*j;
			if (tab[i][j] != 0) {
				printf("%d	",tab[i][j]);
			}
		}
		printf ("\n");
	}

	free (tab); // On libere l'espace memoire reserve
	return (0);
}

// Pour compiler sous Linux :
// gcc -c matrice.c
// gcc -o matrice matrice.o

//Mais je pense que ca devrait marcher sur diff&#65533;ent systeme d'exploitation !

A voir également

Ajouter un commentaire

Commentaires

t2bs
Messages postés
1
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
19 juin 2003
-
Merci, y a toujours des débutants. C'est bien de penser à nous ;-)
On se sent moins seul!!!
Bybydjou
Messages postés
8
Date d'inscription
mercredi 16 octobre 2002
Statut
Membre
Dernière intervention
10 février 2005
-
la fonction free() libere la memoire alloué a la variable qui lui est passe en argument, rien de plus, donc vu que tab est un tableau de pointeur, ce qui est libéré c est l espace alloué pour stocker les pointeurs, ce qui fait que les espaces memoires vers lesquels pointent tous ces pointeurs ne sont pas, eux, desalloués
bon, je sais pas si je suis tres clair, mais j espere que ca t aidera
cs_Black Night
Messages postés
44
Date d'inscription
jeudi 5 octobre 2000
Statut
Membre
Dernière intervention
21 juin 2003
-
Comme quoi on en apprend tous les jours ! OK merci les gars je n'étais pas au courant (d'ailleaurs je ne m'étais jamais posé la question de comment libéré la mémoire, je faisais toujours free (tab).)
Mais pourtant avec mon compilateur (gcc sous linux) ca marche sans problème. Pourriez-vous m'expliquer pourquoi. Merci d'avance.
Bybydjou
Messages postés
8
Date d'inscription
mercredi 16 octobre 2002
Statut
Membre
Dernière intervention
10 février 2005
-
oui, Kaid a raison, mais il y a une seconde erreur, tu ne verifie pas l allocation de la seconde dimension
cs_Kaid
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Tu as une erreur lors de la désallocation de la mémoire. Avant de libérer le tableau 'tab' il faut libérer la mémoire allouée pour chaque élément du tableau.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.