Int et void*
Résolu/Fermé4 réponses
void inserer_entier (struct B, int elem)
{
void *tmp=(void *)elem;
inserer( B->deleg, elem);
}Evidemment 'elem' est un 'integer', tu ne peux le transformer en 'void*'; le propose:
void inserer_entier (struct B, int* elem)
{
inserer (B->deleg, (void*)elem);
}
merci j'ai finalement essayé ce que tu m'a dis je n'ai finalement plus cette erreur.
Par contre lorsque je test :
int main(void){
struct s=creer_struct_A();
int a;
*a=5;
int b;
*b=18;
inserer(s,a);
printf(){};//affiche le champs de la structure ou a a été affecté
inserer(s,b);
printf(){};
la première insertion se passe bien cependant la ligne (*a=18) génère une erreur de segmentation et je n'arrive pas comprendre pourquoi;
Par contre lorsque je test :
int main(void){
struct s=creer_struct_A();
int a;
*a=5;
int b;
*b=18;
inserer(s,a);
printf(){};//affiche le champs de la structure ou a a été affecté
inserer(s,b);
printf(){};
la première insertion se passe bien cependant la ligne (*a=18) génère une erreur de segmentation et je n'arrive pas comprendre pourquoi;
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
>
loupius
1 avril 2009 à 17:09
1 avril 2009 à 17:09
Salut,
(pour moi c'est un mystère).
L'opérateur unaire de déréférence * s'applique à un pointeur et il donne l'accès à l'objet pointé par le pointeur.
Dans ce cas int a, a n'est pas une pointeur mais une variable normale. Comme * ne peut être appliqué qu'à un pointeur, tu te rends compte que tu le savais déjà, donc il n'y a plus de mystère ;-))
Il suffit de l'appliquer au pointeur &a et ça marche
Mais bon, autant faire a=5
(pour moi c'est un mystère).
L'opérateur unaire de déréférence * s'applique à un pointeur et il donne l'accès à l'objet pointé par le pointeur.
Dans ce cas int a, a n'est pas une pointeur mais une variable normale. Comme * ne peut être appliqué qu'à un pointeur, tu te rends compte que tu le savais déjà, donc il n'y a plus de mystère ;-))
Il suffit de l'appliquer au pointeur &a et ça marche
lami20j@debian:~/trash$ cat int.c
#include<stdio.h>
int main()
{
int a;
*&a = 5;
printf("%d\n",a);
return 0;
}
lami20j@debian:~/trash$ gcc int.c
lami20j@debian:~/trash$ ./a.out
5
Mais bon, autant faire a=5
loupius
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
1 avril 2009 à 19:56
1 avril 2009 à 19:56
Ce qui pour moi était un mystère, c'était que ça puisse passer à la compilation.
Je vais en profiter pour corriger le code; en effet j'aurais dû écrire:
Je vais en profiter pour corriger le code; en effet j'aurais dû écrire:
int* a; a = (int*)malloc(sizeof(int)); *a = 5;
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 816
20 mars 2009 à 18:17
20 mars 2009 à 18:17
Salut,
Ce code :
int a;
*a=5;
ne doit pas passer à la compilation (à moins que le compilateur ne respecte pas la norme). Si tu veux que cela passe à la compilation, il faudra réaliser des casts. Attention tout de même à initialiser la variable "a" qui devra contenir une adresse.
Par exemple :
int a; //il manque toujours l'adresse stockée dans a.
*(int *)a=5;
Plus simple serait le code proposé par loupius
int *a;
*a=5;
qui passera la compilation. Mais cela provoquera une erreur de segmentation à l'exécution puisque la variable "a" ne contient toujours pas d'adresse.
Ce code :
int a;
*a=5;
ne doit pas passer à la compilation (à moins que le compilateur ne respecte pas la norme). Si tu veux que cela passe à la compilation, il faudra réaliser des casts. Attention tout de même à initialiser la variable "a" qui devra contenir une adresse.
Par exemple :
int a; //il manque toujours l'adresse stockée dans a.
*(int *)a=5;
Plus simple serait le code proposé par loupius
int *a;
*a=5;
qui passera la compilation. Mais cela provoquera une erreur de segmentation à l'exécution puisque la variable "a" ne contient toujours pas d'adresse.