Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pointeur de pointeur de structure

6 réponses
Avatar
John Ramm
bonjour

j'ai une structure du style
typedef struct {
int altitude;
} mastruct;

j'ai une function du style

setaltitude(mastruct **s) {
(*s)[0].altitude = 12;
}

et je l'appelle comme ceci dans mon main:

mastruct s[10];

setaltitude(&s);

je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;

merci!

6 réponses

Avatar
Horst Kraemer
On Fri, 5 Mar 2004 21:37:56 +0100, "John Ramm"
wrote:

bonjour

j'ai une structure du style
typedef struct {
int altitude;
} mastruct;

j'ai une function du style

setaltitude(mastruct **s) {
(*s)[0].altitude = 12;
}


Attention. Cela ne fonctionne (quand tu appelles la fonction avec
l'argument correct) que par hasard pour le premier pointeur du
tableau. (*s)[1].altitude = 12; serait faux.

setaltitude(mastruct **s) {
s[0]->altitude = 12;

ou bien
(*s[0]).altitude = 12;

}



et je l'appelle comme ceci dans mon main:

mastruct s[10];

setaltitude(&s);


setaltitude(s);


je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;



Ta fonction attend un argument du type mastructure** (pointeur de
pointeur de structure) et tu lui donnes un argument du type
mastructure * (*) [10] (pointeur de tableau de pointeurs vers
mastructure).

L'argument 's' (tableau de pointeur de structure) devient
automatiquement un pointeur de pointeur de structure.

--
Horst

Avatar
Régis Troadec
Salut,

"John Ramm" a écrit dans le message de news:
4048e454$
bonjour

j'ai une structure du style
typedef struct {
int altitude;
} mastruct;

j'ai une function du style

setaltitude(mastruct **s) {
(*s)[0].altitude = 12;
}

et je l'appelle comme ceci dans mon main:

mastruct s[10];

setaltitude(&s);



Le nom d'un tableau est synonyme de l'adresse de son premier element, donc s
= &s[0].
Et &s, c'est pareil.
s est un tableau, c'est en gros equivalent a un pointeur sur mastruct (
mastruct *s),
et setaltitude attend un pointeur sur un pointeur de mastruct.
Normalement, ton compilo a du renvoyer un warning : types de pointeurs
incompatibles a l'appel de la fonction setaltitude().

je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;


s est un mastruct* et non un mastruct**, d'ou le segfault.
Une copie locale de l'adresse du tableau s est realisee au niveau de la
fonction setaltitude() lors de l'appel (car s=&s[0]=&s pour les tableaux) et
tu déréfences (accèdes au contenu du pointeur) 2 fois avec d'abord
l'opérateur *, puis avec l'opérateur []

Une solution, enlever un niveau d'indirection a setaltitude() :

void setaltitude(mastruct *s)
{
s[0].altitude = 12; // ou *s = 12; ou *(s+0);
}

Appel avec simplement setaltitude(s);

HTH
Regis

merci!




Avatar
Horst Kraemer
On Fri, 5 Mar 2004 21:37:56 +0100, "John Ramm"
wrote:

bonjour

j'ai une structure du style
typedef struct {
int altitude;
} mastruct;

j'ai une function du style

setaltitude(mastruct **s) {
(*s)[0].altitude = 12;
}

et je l'appelle comme ceci dans mon main:

mastruct s[10];

setaltitude(&s);

je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;

merci!


setaltitude(mastruct *s) {
s[0].altitude = 12;
s[5].altitude = 12;
}

mastruct s[10];

setaltitude(s);


Règle générale en C: Quand on veut passer un tableau de toto à une
fonction on déclare la fonction tout simplement

void f( toto a[] );
ou
void f( toto *a );

On l'appelle avec le tableau sans &.

Le problème est que l'adresse d'un tableau de toto n'équivaut *pas* à
un pointeur de pointeur de toto mais à un pointeur de tableau de toto.

Un tableau se transforme en pointeur - mais seulement au premier
niveau,

tableau de toto -> pointeur de toto

mais un pointeur de tableau de toto n'équivaut jamais à une pointeur
de pointeur de toto.

--
Horst

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "John Ramm" wrote:

j'ai une structure du style
typedef struct {
int altitude;
} mastruct;


Ok.

j'ai une function du style

setaltitude(mastruct **s) {
(*s)[0].altitude = 12;
}


Pourquoi **s?

Pourquoi pas *s? As-tu vraiment l'intention de modifier l'adresse de la
structure? Pourquoi faire ?

et je l'appelle comme ceci dans mon main:

mastruct s[10];

setaltitude(&s);


Depuis quand faut-il utiliser & pour passer l'adresse d'un tableau?

setaltitude(s);

avec

setaltitude(mastruct * const s)
{

(on peut éventuellement ajouter le nombre d'élements)

setaltitude(mastruct * const s, size_t const nb)
{

je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;


s[0]->altitude = 12;

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Emmanuel Delahaye wrote:

s[0]->altitude = 12;


s[0].altitude = 12;

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Régis Troadec
void setaltitude(mastruct *s)
{
s[0].altitude = 12; // ou *s = 12; ou *(s+0);
/*


(*s).altitude = 12; pour l'element 0 ,
plus generalement (*(s+i)).altitude; pour l'element i

*/