Bonjour,

J'ai le soucis suivant : j'ai une fonction qui prend en paramètre un void *. Pour le moment, je lui passe une chaine de caractere, qui contient des paramètres que je lis dans la fonction avec sscanf :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void fun (void * chaine)
{
//...
    ret = sscanf (chaine, "%d %d %42s", &a, &b, str);
//...
}
 
// Appel : 
int main (void)
{
//....
sprintf (chaine, "%d %d %s", a, b, c);
 
fun (chaine);
//...
Mon soucis : je souhaite maintenant passer un pointeur, toujours via chaine. J'ai bien pensé à utiliser le formateur %p, mais j'ai une segmentation fault lors de la lecture...
Je sais que je pourrai passer par une structure contenant le pointeur et la chaine (et caster le tout en void *), mais ca ferait trop de changements dans le projet pour que je puisse le faire sereinement.

Donc est-ce qu'il existe une possibilité de passer un pointeur, et de le récupérer correctement dans ma fonction ?

SSCCE qui plante (segfault) [i est là pour faire joli, il ne sert à rien dans ce code]:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
#include <stdio.h>
#include <stdlib.h>
 
void f (char * chaine)
{
  FILE * test = NULL;
  int ret;
  int i;
 
  ret = sscanf (chaine, "chaine %p %d", test, &i);
  printf ("ret : %d, adresse %p, i %d\n", ret, test, i);
 
}
 
int main (void)
{
  FILE * toto = NULL;
  int ret;
  int i = 42;
  char chaine[42] = {0};
  int lg_chaine = 42;
 
  toto = fopen ("/tmp/test_toto", "a");
  if (toto == NULL)
  {
    printf ("error or fopen\n");
    return EXIT_FAILURE;
  }
  else
  {
    snprintf (chaine, lg_chaine, "chaine %p %d", toto, i);
    printf ("adresse avant : %p\n", toto);
 
    f (chaine);
 
    printf ("adresse apres : %p\n", toto);
 
    ret = EXIT_SUCCESS;
  }
  return ret;
}
Merci de vos solutions.