Bonjour,
J'ai dans une de mes structures, une d'elles qui doit utiliser un double pointeur, afin de modifier (libération et/ou ré-allocation) la mémoire de ce qu'elle pointe sans devoir retourner la nouvelle adresse (l'architecture globale du l'ensemble du programme le requière).

Cela ne pose pas de problème, ce que j'aimerai faire c'est d'accéder depuis la première structure directement aux variables de la dernière (C) sans devoir utiliser de variables intermédiaire mais en enchainant les dé-références, par contre gcc n'apprécie pas les syntaxes que j'essaie de lui passer (mélanges de * et de ->).

Par example, comment afficher proprement l'entier crepe dans la fonction display_answer ?

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
43
44
45
46
47
48
49
#include <stdlib.h>
#include <stdio.h>
 
 
typedef struct t_C {
	int crepe;
}C;
 
typedef struct t_B {
	C *p_C;
}B;
 
typedef struct t_A {
	B **pp_B;
}A;
 
 
void display_answer(A *p_A)
{
 
	//Je dois utiliser un double pointeur pour modifier la structure pointée par pp_B dans d'autres fonctions sans devoir retourner la nouvelle adresse   (cela ne pose pas de problème)
	//par contre, comment faire pour accéder l'entier c depuis un A* avec un enchainement de dé-références tel que : 
 
	int answer; 
	//answer = p_A->pp_B->p_C->crepe;			//Dereferance pp_B une seul fois ---> error: request for member 'p_C' in something not a structure or union
	//answer = p_A->*pp_B->p_C->crepe;		//Essai de double dereferanciation test.c:26: error: expected identifier before '*' token	
	//answer = p_A->(*pp_B)->p_C->crepe;		//Essai de double dereferanciation test.c:27: error: expected identifier before '(' token
	answer = p_A->pp_B[0]->p_C->crepe;			//Dereferance avec un [0] puis un -> cela marche, mais c'est fort laid.
 
	printf("The answer is %d\n", answer);
}
 
 
int main(int argc, char** argv)
{
	A *p_A = malloc(sizeof(A));
	B *p_B = malloc(sizeof(B));
	C *p_C = malloc(sizeof(C));
 
	p_A->pp_B = &p_B;
	p_B->p_C = p_C;
	p_C->crepe = 42;
 
	display_answer(p_A);
 
	//free ... 
 
	return EXIT_SUCCESS;
}