Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1354 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Malloc qui recouvre un espace alloué à la compilation ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Malloc qui recouvre un espace alloué à la compilation ?

n°1871152
MKflo84
Posté le 08-04-2009 à 15:30:04  profilanswer
 

Bonjour,
 
Je rencontre un problème qui m'a l'air assez "sioux".
 
J'ai un code source C dans lequel je déclare:

Code :
  1. main()
  2. {
  3.    float variable=0;
  4.    float * tab;
  5.    tab=malloc(10000*sizeof(float));
  6.    /* Fonction où je passe &variable et tab et qui contient une boucle affectant des valeurs à tab[i] */
  7. }


 
Pour l'instant j'ai mis un malloc(10000) au lieu d'un [] car à terme je compte rendre cette taille variable à l'exécution.
 
Le problème que je rencontre est que "variable" est alloué à l'adresse 0X0013fe9C, tandis que l'adresse pointée par tab est 0X0013fe0.
Résultat : à la 4é exécution de ma boucle (tab[3] pointe vers 0X0013fe9C, car dans mon case sizeof(float)=4) j'écrase "variable".
 
Ce que je ne comprends pas, c'est que d'après ce que j'ai compris, l'emplacement mémoire de "variable" est réservé à la compilation, tandis que celui pointé par tab, via le malloc est réservé à l'exécution. Je croyais que les deux étaient bien séparés. J'utilise VS Express 2008.
 
Merci d'avance pour votre aide précieuse,
Flo

mood
Publicité
Posté le 08-04-2009 à 15:30:04  profilanswer
 

n°1871165
olivthill
Posté le 08-04-2009 à 15:48:19  profilanswer
 

Dans le cas présent, variable et tab sont des espaces en mémoire sur la pile (stack). Donc l'adresse précise n'est déterminée qu'au moment de l'éxécution.
 
Si ces champs avaient été déclarés en dehors d'une fonction, alors ils auraient été déclarés sur le tas (heap) et auraient eu une adresse fixée lors de la compilation (qui aurait ensuite été ajustée par le loader au moment du chargement du programme en mémoire).
 
Une petite erreur est de ne pas caster le retour du malloc(), d'ailleurs le compilateur devrait émettre un warning. Donc écrire :

tab=(float *)malloc(10000*sizeof(float));

Ensuite, il n'y a pas de raison pour que tab[x], avec x compris entre 0 et 99999, empiète sur les autres variables, car la notation avec les crochets est équivalente à (adresse trouvée dans tab) + x, et non pas à (adresse de tab) + x.

Message cité 1 fois
Message édité par olivthill le 08-04-2009 à 15:53:09
n°1871167
MKflo84
Posté le 08-04-2009 à 15:52:20  profilanswer
 

Merci olivthill, j'allais corriger, bien sûr "variable" n'est pas statique donc sont emplacement est réservée à l'entrée dans le bloc, sur la pile.
 
Mais j'ai tout de même mon malloc qui réserve un emplacement déjà utilisé... et je ne comprends vraiment pas pourquoi.
 

n°1871168
olivthill
Posté le 08-04-2009 à 15:54:50  profilanswer
 

tab est égal à 0X0013fe0, ce qui est proche de l'adresse de variable. Mais ce qui compte est l'adresse indiquée à l'emplacement 0X0013fe0 (voir le complément d'explication dans mon message édité).

n°1871179
Un Program​meur
Posté le 08-04-2009 à 16:25:03  profilanswer
 

@MKflo84, tu n'utiliserais pas &tab a la place de tab par hasard?
 
@olivhill, il n'est pas necessaire -- et beaucoup(*) considerent que c'est de mauvais style de le faire -- de caster le resultat de malloc en C  (ce serait necessaire en C++, un warning ou une erreur sur cette ligne en C resulte generalement d'un autre probleme, oublier d'inclure <stdlib.h> par exemple).
 
(*) ce n'est pas mon cas, mais je sais que je suis plutot dans la minorite.

n°1871195
MKflo84
Posté le 08-04-2009 à 17:06:21  profilanswer
 

Merci "Un Programmeur", j'ai vérifié, je transmets bien "tab" à ma fonction.
 
Pour le cast, je l'avais mis dans mon code. Je ne l'ai juste pas recopié sachant que ça ne faisait pas de différence.
 
Lorsque je remplace mon malloc par un float tab[10000] (sans aucune autre modif), je n'ai pas de problème. L'emplacement mémoire du tableau est bien disjoint du reste. Là, vraiment je suis collé...

n°1871233
Un Program​meur
Posté le 08-04-2009 à 17:33:15  profilanswer
 

Donne un exemple complet et aussi minimal que possible reproduisant ton probleme.

n°1871300
xilebo
noone
Posté le 08-04-2009 à 20:28:25  profilanswer
 

0x13fe0 et 0x13fe9c ne sont pas proches du tout. Ou alors tu as oublié un 0 à la première.

n°1871374
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-04-2009 à 09:30:41  profilanswer
 

olivthill a écrit :

Une petite erreur est de ne pas caster le retour du malloc(),


Ce n'est pas une erreur. Il n'y a aucune raison, depuis C90, de caster le retour d'un malloc() en C. (et en C++, on utilise new).
 
http://mapage.noos.fr/emdel/notes.htm#malloc


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1871515
matafan
Posté le 09-04-2009 à 13:55:24  profilanswer
 

Montre ton code, il y a forcément un endroit ou tu confond l'adresse du pointeur et l'adresse pointée par le pointeur. Ou alors, autre possibilité, tu as un truc dans ton code qui va écraser tab après ton malloc.
 
Tu devrais utiliser un debugger et regarder la valeur de tab juste après le malloc. Ce n'est certainement pas 0X0013fe0.


Message édité par matafan le 09-04-2009 à 13:55:34
mood
Publicité
Posté le 09-04-2009 à 13:55:24  profilanswer
 

n°1871951
Sve@r
Posté le 10-04-2009 à 12:28:34  profilanswer
 

MKflo84 a écrit :

Bonjour,
 
Je rencontre un problème qui m'a l'air assez "sioux".
 
J'ai un code source C dans lequel je déclare:

Code :
  1. main()
  2. {
  3.    float variable=0;
  4.    float * tab;
  5.    tab=malloc(10000*sizeof(float));
  6.    /* Fonction où je passe &variable et tab et qui contient une boucle affectant des valeurs à tab[i] */
  7. }


 
Pour l'instant j'ai mis un malloc(10000) au lieu d'un [] car à terme je compte rendre cette taille variable à l'exécution.
 
Le problème que je rencontre est que "variable" est alloué à l'adresse 0X0013fe9C, tandis que l'adresse pointée par tab est 0X0013fe0.
Résultat : à la 4é exécution de ma boucle (tab[3] pointe vers 0X0013fe9C, car dans mon case sizeof(float)=4) j'écrase "variable".
 
Ce que je ne comprends pas, c'est que d'après ce que j'ai compris, l'emplacement mémoire de "variable" est réservé à la compilation, tandis que celui pointé par tab, via le malloc est réservé à l'exécution. Je croyais que les deux étaient bien séparés. J'utilise VS Express 2008.
 
Merci d'avance pour votre aide précieuse,
Flo


 
J'ai recopié l'intégralité de ton code, j'ai rajouté qq printf() à la fin et chaque fois que j'ai lancé ce programme, j'ai eu des écarts de plusieurs milliers d'octets entre les 2 adresses.
 

MKflo84 a écrit :

Merci "Un Programmeur", j'ai vérifié, je transmets bien "tab" à ma fonction.


Tu veux bien nous montrer cette fonction et sa façon de gérer les paramètres reçus ???


Message édité par Sve@r le 10-04-2009 à 12:36:02

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Malloc qui recouvre un espace alloué à la compilation ?

 

Sujets relatifs
Problème compilation serveur CORBAPHP5 - Compilation Red-Hat 5.2
Espace sous Div avec IE7[résolu] Aide pour compilation
C/C++ Dossier a espaceCréer un espace membre dans un site de chat IRC?
void* , compilation, taille inconnue[ACCESS] Erreur de compilation requete VBA
probleme php exec avec argument et espace[SGBD/SQL] probleme d'espace oracle8i
Plus de sujets relatifs à : Malloc qui recouvre un espace alloué à la compilation ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR