[c]allocation memoire dans une fonction

niark -  
 andre78 -
J ai un petit problene en C.

je n arrive pas faire une procedure pour allouer de la memoire.

ca fonctionne tres bien si je ne mets pas l allocation ds une procedure mais j ai une erreur d adresse si je fais ca dans une procedure

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

void init (int ** tab,int largeur, int hauteur)
{
int i,j;
tab = (int**)malloc( largeur*sizeof(int*));
for (j=0 ; j < largeur ; j++)
{
*(tab+j) = (int*)malloc( hauteur*sizeof(int) );
}

for (j = 0; j < hauteur -1; j++)
{
for (i = 0; i < largeur -1;i++)
{
tab[i][j] =0;
// printf("%d ",tab[i][j]);
}
}
}

int main ()
{
int i,j;
i = 0;
j = 0;
int largeur = 200;
int hauteur = 200;
int **tab;
init(tab,largeur, hauteur);
printf("%d", tab[i][j]);
return 0;
}

pourquoi le printf fonctionne pas alors que le code ci dessous fonctionne ?
int main ()
{
int i,j;
i = 0;
j = 0;
int largeur = 200;
int hauteur = 200;
int **tab;
//init(tab,largeur, hauteur);
tab = (int**)malloc( largeur*sizeof(int*));
for (j=0 ; j < largeur ; j++)
{
*(tab+j) = (int*)malloc( hauteur*sizeof(int) );
}

for (j = 0; j < hauteur -1; j++)
{
for (i = 0; i < largeur -1;i++)
{
tab[i][j] =0;
// printf("%d ",tab[i][j]);
}
}
i=0;
j=0;
printf("%d\n", tab[i][j]);
return 0;
}

Je pense que ca doit etre une petit truc mais je ne vois pas quoi ...
Merci :D
A voir également:

8 réponses

sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
pour l'allocation utilise (int*) au lieu du (int**) car tu vas allouer l'espace pour un tableau d'entiers non pas un tableau de pointeurs sur des entiers
0
niark
 
bah j aurai qu un tableau a 1 dimension si j alloue des int * ds ce cas non ?

ce que je voudrais c est avoir un tableau a 2 dimension que je passerai en parametre des fonctions ...

ce que je comprends pas c est que dans la fonction mon tableau est bien modifie en local dans la fonction(le printf de tab dans la procedure fonctionne) mais j ai l impression qu il ne modifie pas le tableau que j ai passe en parametre...

merci
0
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
remplace:
 tab = (int**)malloc( largeur*sizeof(int*));
for (j=0 ; j < largeur ; j++)
{
*(tab+j) = (int*)malloc( hauteur*sizeof(int) );
} 

par:
 tab = (int*)malloc(hauteur* largeur*sizeof(int));
0
niark
 
je vais tenter lol

ca va me faire du travail au niveau raisonnement car je voulais travailler sur une matrice 2 2 qui reprensente des pixels :S la je vais devoir joue avec les modulos lol

merci je vais essayer ca mais si t as une solution pour une matrice 2*2 j avoue que je preferais :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
tu n'as rien a changer pour tavailler avec ton tableau!
utilise tab[i][j], ça fonctionne avec le nouveau code!
0
niark
 
lol ok merci ^^
0
niark
 
marche pas mais c est bon j ai trouve lol je suis passe par une fonction au lieu d une procedure ^^ merci qd meme :D
0
andre78
 
Une fonction qui permet de récupérer le contenu d'un fichier dans une chaine de caractère:

extern int sklib_read(char** buffer, size_t size, const char* path, const char* mode)
{
if(strcmp(mode,"r") != 0)
{
printf("Ouvrir le fichier en lecture seule SVP\n");
exit(EXIT_FAILURE);
}
*buffer=calloc((size+1), sizeof(char));
if(*buffer == NULL)
{
printf("Défaut mémoire");
exit(EXIT_FAILURE);
}
FILE* file;
if((file=fopen(path, mode)) == NULL) return 1;
fread(*buffer, size, 1, file);
if(ferror(file)) return 1;
if(fclose(file) != 0) return 1;
strcat(*buffer, "\0");
return 0;
}

Dans le main, on l'appelle de la manière suivante:
int main(void)
{
char* file_content=NULL;
char* path="./fichier.txt";
size_t filesize=<fonction qui retourne le nombre de caractères que contient le fichier>
sklib_read(&file_content, filesize, path, "r");
}


Pour pouvoir modifier ton pointeur en argument sans utiliser le retour de la fonction, il s'agit donc de travailler avec un pointeur de chaînes de caractères et donc un pointeur de pointeur de caractère.

Dans ton cas précis, ça devrait faire quelque chose comme ça:

int *tab;
init(&tab, largeur, hauteur);

avec le prototype suivant:
void init(int** tab, int largeur, int hauteur);
0