Comment déclarer proprement des pointeurs - C - Programmation
Marsh Posté le 27-11-2005 à 16:58:14
Code :
|
ça te forcera à faire une allocation par la suite avant de pouvir utiliser ton pointeur
Marsh Posté le 27-11-2005 à 18:21:23
frankie_flowers a écrit : je viens de m'apercevoir qu'intervertir l'ordre de deux déclarations de pointeurs peut créer des erreurs de segmentation |
Le problème est ailleurs. Si tu définis des pointeurs sans leur donner une valeur valide, le déréférencement produit un comportement indéfini. C'est un bug de codage.
Citation : Je crois avoir compris que le problème est qu'aucun emplacement n'est réservé pour stocker la valeur pointée par char** (une adresse). |
Oui. Le pointeur pointe n'importe où.
Citation : Est-ce que je suis obligé de faire un malloc() après chaque déclaration de pointeur ? |
Non. Ce qui est obligatoire, c'est que la valeur du pointeur soit valide au momement où tu l'utilises (ou si tu le passes à une fonction).
Citation :
est correct ? ou y'a t-il toujours un risque de seg_fault ? |
14 ça veut dire quoi ? Tu trouves que ça ressemble à une adresse valide ?
p n'étant pas défini, le comportement est indéfini. C'est un bug. Oui, il y a de risque de seg_fault.
Il y a 4 façons standards d'initialiser un pointeur
if (p != NULL) ... |
plus les variantes dérivées de ces exemples...
Marsh Posté le 28-11-2005 à 09:17:50
frankie_flowers a écrit : Bonjour, |
Non. Mais chaque fois que tu déclares un pointeur style "<type> *pt"; tu es obligé d'écrire quelque part "pt=...<une adresse valide>..." avant de t'occuper de "*pt".
Donc si tu déclares un pointeur double style "<type> **pt"; il faut d'abord que t'écrives qqpart "pt=...<une adresse valide>..." avant d'aller t'occuper de "*pt" qui devra lui aussi recevoir "...<une adresse valide>..." avant que t'ailles t'occuper de "**pt".
Etc etc
La fonction "malloc()" alloue une zone mémoire et renvoie l'adresse de la zone allouée. Donc "malloc()" renvoie une adresse valide et c'est pourquoi on peut écrire "pt=malloc(...)". Mais c'est pas la seule façon d'y mettre une adresse valide.
On peut aussi écrire "int i; int *pt; pt=&i"
La seule constante, c'est qu'il y a toujours écrit quelque part "pt=..."
Marsh Posté le 28-11-2005 à 11:22:07
Emmanuel Delahaye a écrit : |
il a ecrit
*p = 14;
pas
p = 14;
(noob)
Marsh Posté le 28-11-2005 à 11:23:12
'fin c'est faux quand même, puisque p est indéfini à cet endroit du programme
Marsh Posté le 28-11-2005 à 11:23:42
Sve@r a écrit : |
Code :
|
(nan rien, c'est juste pour faire mon chieur)
Marsh Posté le 28-11-2005 à 11:33:14
chrisbk a écrit : il a ecrit
|
Ok. Je me suis laissé emporté... Corrigé.
Marsh Posté le 28-11-2005 à 12:42:02
Citation : Code : |
soit le code
Code :
|
on compile et on exécute
fronsac:18> gcc -o essai2 essai2.c
essai2.c: Dans la fonction « main »:
essai2.c:9: AVERTISSEMENT: affectation d'un type pointeur incompatible
essai2.c:10: AVERTISSEMENT: affectation transforme en entier un pointeur sans transtypage
fronsac:19> essai2
effectivement ça ne plante pas mais je doute que cela face quelque chose d'interessant et d'utile.
de plus a mon avis pp n'est toujours pas initialisé.
il est possible que dans l'élan une coquille ce soit glissé malicieusement et qu'il fallait lire **ppp
Marsh Posté le 28-11-2005 à 13:57:00
chrisbk a écrit :
|
Bon, c'est vrai, tu as trouvé un exemple où on peut avoir *pp sans avoir pp=...
Mais en fait, tu masques l'instruction pp=&p en utilisant *ppp qui correspond à pp
Dans les faits... c'est comme si t'avais écrit pp=&p... sauf qu'il faut bien examiner le code pour s'en rendre compte.
Ceci démontre qu'on peut toujours pondre un code correct mais réellement illisible.
Marsh Posté le 28-11-2005 à 14:00:39
oué chui fan de trucs porcho, j'adore parsemer mon code de machin comme ca pour faire rire mes collegues :
Code :
|
Marsh Posté le 27-11-2005 à 16:22:05
Bonjour,
je viens de m'apercevoir qu'intervertir l'ordre de deux déclarations de pointeurs peut créer des erreurs de segmentation
Je crois avoir compris que le problème est qu'aucun emplacement n'est réservé pour stocker la valeur pointée par char** (une adresse).
Est-ce que je suis obligé de faire un malloc() après chaque déclaration de pointeur ?
D'autre part, en prenant un exemple simple, est-ce que
est correct ? ou y'a t-il toujours un risque de seg_fault ?