#1 Le 02/11/2008, à 14:56
- sifourquier
[résolu] pointeur void * attention : assignment makes pointer from...
Bonjour
j'ai un warning dans le programme que je crée
attention : assignent makes pointer from integer without a cast
je ne comprend pas bien car j'assigne un pointeur void (void*) a un pointeur de pointeur Tjoy (Tjoy**) qui est un type def d'une structure
ma structure
struct Tjoy
{
unsigned char present;
float axes[ABS_MAX+1];
unsigned char buttons[KEY_MAX - BTN_MISC + 1];
unsigned char nb_axes;
unsigned char nb_buttons;
int version;
char name[NAME_LENGTH];
};
typedef struct Tjoy Tjoy;
ma fonction
void * mon_malloc_joy(unsigned long int dim);
....
void * mon_malloc_joy(unsigned long int dim)
{
void * p;
p=malloc(dim);
if(p==NULL)
{
printf("\nerreur d'allocation de la mémoire\n");
quit(0);
}
return p;
}
le code qui fait le warning
Tjoy ** joy;
Tjoy ** InitJoy ()
{
...
joy=mon_malloc(sizeof(Tjoy *)*NB_MAX_JOY);
...
}
voila s'est seulement un warning et sa marche mais j'aimerais comprendre
j'ai tester avec
joy=(Tjoy **)mon_malloc(sizeof(Tjoy *)*NB_MAX_JOY);
mais sa me donne
attention : transtypage vers un pointeur depuis un entier de taille différente
sa marche très bien avec les pointeur de char ou autre s'est seulement avec les structure que sa fait le warning
sa marche aussi très bien avec malloc directement
voila si vous avez une idée
Dernière modification par sifourquier (Le 03/11/2008, à 19:43)
Hors ligne
#2 Le 02/11/2008, à 16:21
- tiky
Re : [résolu] pointeur void * attention : assignment makes pointer from...
Bonjour,
Utilise le type size_t pour passer la dimension de la zone mémoire à ta fonction malloc.
Tu dois initialiser ton pointeur à NULL avant un malloc.
Voilà un exemple ( j'ai pas mis les testes des pointeurs après les mallocs, mais il faut les faire )
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int main( void )
{
int ** ptr = NULL;
ptr = malloc( sizeof( int * ) * SIZE );
int i;
for( i = 0; i < SIZE; i++ )
{
ptr[i] = NULL;
ptr[i] = malloc( sizeof( int ) );
*(ptr[i]) = 123;
}
for( i = 0; i < SIZE; i++ )
{
free( ptr[i] );
}
free( ptr );
return 0;
}
Note: Ta fonction malloc est mauvaise car tu quittes sans libérer la mémoire.
Dernière modification par tiky (Le 02/11/2008, à 16:36)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#3 Le 02/11/2008, à 17:00
- rniamo
Re : [résolu] pointeur void * attention : assignment makes pointer from...
@tiky : pourquoi elle est mauvaise ? on ne libère pas dans le malloc si ?
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#4 Le 02/11/2008, à 17:41
- tiky
Re : [résolu] pointeur void * attention : assignment makes pointer from...
@tiky : pourquoi elle est mauvaise ? on ne libère pas dans le malloc si ?
J'ai pas dit qu'il fallait libérer dans le malloc mais il quitte dans le malloc sans faire de libération. Enfin comme j'ai pas tout le code, je peux me tromper.
Dernière modification par tiky (Le 02/11/2008, à 17:41)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#5 Le 02/11/2008, à 17:42
- rniamo
Re : [résolu] pointeur void * attention : assignment makes pointer from...
ok, autant pour moi
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 03/11/2008, à 19:05
- sifourquier
Re : [résolu] pointeur void * attention : assignment makes pointer from...
Merci mais j'ai tester avec size_t et sa ne change rien
pour ce qui est de la libération elle est bien après et je fait aussi l'allocation de tout les pointeur avec la boucle mais je ne comprend vraiment pas ce warning
cette fonction est utiliser pour remplacer le malloc standard pour faire une vérification si il y a bien marcher
je veux qu'on puisse changer n'importe qu'elle malloc dans un programme par celui la
Dernière modification par sifourquier (Le 03/11/2008, à 19:30)
Hors ligne
#7 Le 03/11/2008, à 19:42
- sifourquier
Re : [résolu] pointeur void * attention : assignment makes pointer from...
bon ben s'est les erreur les plus stupide les plus dure a trouver
j'apelle mon_malloc et la fonction sapelle mon_maloc_joy
....
Hors ligne
#8 Le 03/11/2008, à 19:46
- nicolas.sitbon
Re : [résolu] pointeur void * attention : assignment makes pointer from...
Tu dois initialiser ton pointeur à NULL avant un malloc.
Non, absolument pas :
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5U
int main (void)
{
int **ptr = malloc (SIZE * sizeof *ptr);
if (ptr != NULL)
{
for (size_t i = 0; i < SIZE; i++)
{
ptr[i] = malloc (sizeof *ptr[i]);
if (ptr[i] != NULL)
{
*(ptr[i]) = 123;
}
}
for (size_t i = 0; i < SIZE; i++)
{
free (ptr[i]), ptr[i] = NULL;
}
free (ptr), ptr = NULL;
}
return 0;
}
Hors ligne
#9 Le 03/11/2008, à 20:48
- nicolas66
Re : [résolu] pointeur void * attention : assignment makes pointer from...
Tout à fait d'accord, il n'y a pas d'obligation à initialiser son pointeur avant un `malloc' ...
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne