JeuxOnLineForumsPlusConnectés : 633 (sites) | 1022 (forums)Créer un compte
Forums divers
La Taverne
Les forums JOL > Forums divers > La Taverne > Programmation en C (pointeurs) RSS
   
Répondre
Partager Outils Rechercher
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Citation:
Provient du message de Lango Silma
mothra : un pointeur fraichement alloué a pour valeur celle qui se trouvait sur la pile à l'emplacement qui lui est réservé... cet emplacement n'est pas forcément sur une page qui vient d'être allouée, donc pas nécéssairement à 0... [/i]
En effet, apparement lorsque le loader charge le fichier a exec la page est deja initialisée et contient deja du garbage et pas du 0 (je viens de tester). J'avais fait l'assertion incorrecte de penser que le nouveau programme etait lancé dans un page mallocée fraiche (tout ca est de toute facon tres implémentation dépendant, caitraimal de faire des choses comme ca ) .

Sinon apres verifications ca segfault bel et bien d'acceder a p déclaré de la seconde facon, conformement a ce que la declaration laisse penser (bon en fait ca segfault pas mais l'adresse est fantaisiste apres verification dans gdb) .
Lien direct vers le message - Vieux
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Citation:
Provient du message de Lemuel
Il y a un petit problème avec ce programme...
il n'accepte pas les
getch();

et moi, c'est la seule façon que j'ai trouvé pour que la fenêtre dos reste en place après avoir exécuté le programme... autrement, elle se ferme après avoir été exécutée... -> impossibilité de voir le résultat du programme.

Enfin bon, j'essaye déjà de le décoder comme ça
getch() n'est pas une fonction qui existe en C ANSI ou en C Posix, tu ne dois donc pas l'utiliser. Les bonnes fonctions sont getchar() et fgetc() qui sont fournies dans stdio.h
Lien direct vers le message - Vieux
Avatar de Lemuel
Lemuel
Alpha & Oméga
 
Avatar de Lemuel
 
Voilà, trouvé un moyen de bloquer la fenêtre :

La première partie affiche la taille d'un caractère, d'un entier ou d'un double.

La seconde partie, je ne me souviens pas d'avoir vu des '*' à la fin de parenthèses... dnoc je ne vois pas...

La troisième partie, ça affiche les adresses des variables.

Par contre, j'ai du mal de répondre à tes questions...
Pour moi, des printf associés à des &, c'est écrire l'adresse de l'élément... mais c'est tout ce que je vois
Lien direct vers le message - Vieux
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Tu as vu juste dans la premiere partie
dans la seconde, je fais exactement la meme chose. Je te rapelle qu'on fait sizeof(type). Ici a la place de mettre int comme type, je met int * (pointeur sur un entier) et j'affiche la taille de ce type.

Pour la troisieme partie, en effet j'affiche les adresses des elements déclarés au dessus. Regardes ces adresses et la distance qui les separe et compares avec les sizeof des elements, tu devrais observer comment sont alloués les tableaux et les pointeurs que tu declares.
Lien direct vers le message - Vieux
Avatar de Lango
Lango
 
Avatar de Lango
 
Citation:
Provient du message de Mothra
Pour la troisieme partie, en effet j'affiche les adresses des elements déclarés au dessus. Regardes ces adresses et la distance qui les separe et compares avec les sizeof des elements, tu devrais observer comment sont alloués les tableaux et les pointeurs que tu declares.
le problème c'est que l'allocation sur la pile est beaucoup plus compliquée qu'il n'y parait... il faut penser à plein de trucs, dont le fait que la pile est découpée par blocs de 4 octets, ce qui fait que des fois on a des blancs de quelques octets entre 2 variables. d'ailleurs j'ai regardé je comprends pas tout, la politique d'allocation a l'air de différer pour tableau et non-tableau... (tc est un octet plus bas que j'aurais pensé), et j'ai un trou ce 4 octects entre d et tc

Comme Lemuel ne doit pas maitriser ce qu'est la pile (si déjà il a vu ce que c'était...) je lui conseille d'oublier tout ça
Lien direct vers le message - Vieux
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Ca n'est pas la pile qui est decoupée en bloc de 4, c'est le compilateur qui aligne les instructions et les données sur 4 octets pour accelerer l'execution. Ca n'est pas tres compliqué et je trouve au contraire qu'il est bon de savoir ce qui se passe quand on declare deux trois entiers et 4 5 pointeurs. Ca permet de comprendre pourquoi le programme plante mysterieusement dans un printf qui n'a rien a voir ou des choses extremement puzzlante autrement
Lien direct vers le message - Vieux
Avatar de Lemuel
Lemuel
Alpha & Oméga
 
Avatar de Lemuel
 
J'ai plus ou moins compris certains trucs

pour a (entier), j 'ai comme adresse : 0012FF88
pour b (entier), j'ai comme adresse : 0012FF84 (décalé de 4 bits apparemment, par rapport à a... la longueur d'un entier)

pa, comme adresse : 0012FF80
mais je comprends pas comment ça se fait

c (char) a comme adresse : 0012FF7F
d (double) a comme adresse : 0012FF74
mais j'aurais crû qu'il aurait eu une adresse décalée de 8 bits, et pas de 12...
Lien direct vers le message - Vieux
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Il y a tc aussi entre les deux, ce qui rajoute 11 bytes (+1 de c) ce qui donne bien les 12 attendus. Relances le programme en declarant tc[12] a la place de tc[11]. Tu devrais observer le fameux alignement a 4. A la place de prendre 1 octet comme normal, le denier char du tableau va en prendre 4 (en fait 1 utile pour la valeur et 3 de bourage pour respecter l'alignement).
Lien direct vers le message - Vieux
Avatar de Kathandro
Kathandro
Bagnard
 
Avatar de Kathandro
 
Pour garder une fenêtre DOS active après avoir exécuté quelquechose, tu faire un "system pause" ça marche aussi très bien...
Il attendra que tu tape sur une touche pour continuer à dérouler ...

Euh, par contre, la nuance entre int (*p)[10] et int *p[10], mais j'ai pas de meilleure explication que celle de ton cours (c'est celle-là à laquelle j'avais pensé ), je l'ai bien saisie personnellement...

Et euh sinon, pour avoir fait tourné un débugger plusieurs fois, je peux assurer que la valeur d'un pointeur est totalement aléatoire si on ne l'initialise pas.
Lien direct vers le message - Vieux
Avatar de Lango
Lango
 
Avatar de Lango
 
Citation:
Provient du message de Mothra
Ca n'est pas la pile qui est decoupée en bloc de 4, c'est le compilateur qui aligne les instructions et les données sur 4 octets pour accelerer l'execution.
2 façons différentes de dire la même chose...

Citation:
Provient du message de Mothra
Ca n'est pas tres compliqué et je trouve au contraire qu'il est bon de savoir ce qui se passe quand on declare deux trois entiers et 4 5 pointeurs. Ca permet de comprendre pourquoi le programme plante mysterieusement dans un printf qui n'a rien a voir ou des choses extremement puzzlante autrement
c'est pas compliqué quand tu l'as vu en cours. Et que tu as eu le temps d'y réfléchir souvent...
Ce n'est pas le plus important à maitriser pour bien programmer en c. D'ailleurs la position exacte dans la pile n'est pas spécifiée dans la norme c et est au choix du compilateur.
Lien direct vers le message - Vieux
Avatar de Kathandro
Kathandro
Bagnard
 
Avatar de Kathandro
 
Pour Lemuel:

int * p;
int ** sp;

p=& sp ;

/* ceci est correct */

le & ça te permet de descendre d'une étoile dans la hiérarchie et de faire des égalités entre des pointeurs et des super pointeurs .
Lien direct vers le message - Vieux
Avatar de Foehn
Foehn
Alpha & Oméga
 
Avatar de Foehn
 
Quand je lis tout ça, finalement, je ne suis pas malheureux d'avoir tout oublié du C et des pointeurs
Lien direct vers le message - Vieux
Avatar de Mothra
Mothra
 
Avatar de Mothra
 
Citation:
Provient du message de Lango Silma

c'est pas compliqué quand tu l'as vu en cours. Et que tu as eu le temps d'y réfléchir souvent...
Je l'ai presenté il y a 3 semaines a des iut premiere année et ils l'ont compris directement, apparement Lemuel aussi a compris

Citation:
Ce n'est pas le plus important à maitriser pour bien programmer en c. D'ailleurs la position exacte dans la pile n'est pas spécifiée dans la norme c et est au choix du compilateur.
nous sommes donc parfaitement d'accord. D'ailleurs le but de mon exercice etait plus de souligner d'une part la difference qu'il y a entre l'adresse d'un pointeur et la valeur d'un pointeur (en montrant des &p ca fait reflechir sur la signification de &p et donc differencier &p de p, ce qui est autrement une erreur frequente), et d'autre part de montrer la difference qui existe entre int p[10] et int *p, bien que moralement les deux sont du meme type exactement. Cette histoire d'alignement n'est qu'un petit truc annexe sur lequel les etudiants butent et qu'il faut leur expliquer.

Sinon, a quoi ca sert de savoir un peu ce qui se passe en mémoire (meme si on peut vivre sans je suis parfaitement d'accord).

voila un code typique qui bug :

Code:
int main(void)
{
 int i;
 int tab[5];
 char *s = "blablabla\n";

 for(i = 0; i <= 5; i++) tab[i] = i;

 printf("avant\n");
 printf("%s\n", s);
 printf("apres\n");

 [...]
Et la la question qui tue de l'etudiant : pourquoi ca segfault dans un printf, c'est le bug de gcc ?
Lien direct vers le message - Vieux
Avatar de cesarac
cesarac
Bagnard
 
Avatar de cesarac
 



(heuresement que je suis né trop tard pour pas avoir connus le C)
Lien direct vers le message - Vieux
Avatar de Kathandro
Kathandro
Bagnard
 
Avatar de Kathandro
 
Citation:
Provient du message de cesarac



(heuresement que je suis né trop tard pour pas avoir connus le C)
Cest dans ces moments-là que tu apprécies de faire du Cobol ...
Sinon, à mon sens, ne pas connaître le C pour un programmeur est plus une lacune qu'autre chose.
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forums divers > La Taverne > Programmation en C (pointeurs)
   

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés

Outils Rechercher
Rechercher:

Recherche avancée

Thème visuel : Fuseau horaire GMT +1. Il est actuellement 10h39.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite