[c]allocation memoire dans une fonction
niark
-
andre78 -
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
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:
- [c]allocation memoire dans une fonction
- Mémoire vive - Guide
- Fonction si et - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Fonction miroir - Guide
- Nettoyer memoire iphone - Guide
8 réponses
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
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
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
remplace:
par:
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));
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 :)
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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
tu n'as rien a changer pour tavailler avec ton tableau!
utilise tab[i][j], ça fonctionne avec le nouveau code!
utilise tab[i][j], ça fonctionne avec le nouveau code!
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
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);
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);