IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

malloc dans main


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut malloc dans main
    bjr,
    j'ai appris l'utiliter d'utiliser malloc pour stocker des donnees en dehors de la pile dans une fonction, mais est t il utile d utiliser malloc dans le main ?
    si oui pourquoi ?
    merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    malloc permet aussi d'allouer beaucoup de mémoire, beaucoup plus que la pile ne le permet.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par fantomas261 Voir le message
    bjr,
    j'ai appris l'utiliter d'utiliser malloc pour stocker des donnees en dehors de la pile dans une fonction, mais est t il utile d utiliser malloc dans le main ?
    si oui pourquoi ?
    merci
    main() n'est qu'une fonction parmi les autres. Sa seule particularité est que le programme commence son exécution par elle.
    Les arguments qui justifient l'utilisation de malloc() (dont celui signalé par mabu) s'appliquent aussi bien à la fonction main().

  4. #4
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut
    et le nombre de variable dans la pile est egale au nombre de registre ?

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Non,
    Ca peut dépendre du processeur (et du compilateur)

  6. #6
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut
    ok et vous connaissez le nombre de variable que je peux stocker dans la pile avec gcc

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Déjà je ne sais pas si on peut parler de gcc dans ce cas, il me semble que ni le compilateur ni le langage ne rentre en jeu dans la détermination de la taille de la pile, c'est plus de l'ordre du Système d'exploitation mais, peut-être que je me trompe ?

    Je suppose que tu voulais dire « taille de la pile » et non « nombre de variable » puisque ça n'a pas beaucoup de sens.

    Pour déterminer la taille de la pile on peut faire comme suit (GNU/Linux uniquement) :
    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
     
    #include  <stdio.h>
    #include  <stdlib.h>
    #include <sys/time.h>
    #include <sys/resource.h>
     
    int main( void )
    {
    	struct rlimit rlim;
     
    	getrlimit(RLIMIT_STACK,&rlim);
    	printf("%lu KiB\n",rlim.rlim_cur/1024);
     
    	return 0;
    }
    Une autre façon portable, mais crados (provoquant volontairement un stack overflow) :
    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
     
    #include  <stdio.h>
    #include  <stdlib.h>
     
    #define  PRECISION (100)
     
    void foo(long unsigned bottom)
    {
    	static unsigned calls=0;
    	long unsigned top = (long unsigned)&top;
     
    	calls++;
    	if(calls%PRECISION == 0)
    	{
    		printf("%lu KiB\n", (bottom - top)/1024);
    	}
    	foo(bottom);
    }
     
    int main( void )
    {
    	long unsigned sp = (unsigned long)&sp;
     
    	foo(sp); /* 8184 */
     
    	return 0;
    }
    On se rapproche des 8192 KiB, il faut certainement rajouter la taille de l'enregistrement d'activation (est-ce le bon terme pour stack frame ? ) de printf etc...

    Ceci dit on peut changer la taille de la pile via quelques appels système, sous GNU/Linux cela donne :
    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
     
    #include  <stdio.h>
    #include  <stdlib.h>
    #include <sys/time.h>
    #include <sys/resource.h>
     
    #define  PRECISION (100)
     
    void foo(long unsigned bottom)
    {
    	static unsigned calls=0;
    	long unsigned top = (long unsigned)&top;
     
    	calls++;
    	if(calls%PRECISION == 0)
    	{
    		printf("%lu KiB\n", ((bottom - top)/1024));
    	}
    	foo(bottom);
    }
     
    int main( void )
    {
    	long unsigned sp = (unsigned long)&sp;
    	struct rlimit rlim;
     
    	getrlimit(RLIMIT_STACK,&rlim);
    	printf("Current Stack Size : %lu KiB\n",rlim.rlim_cur/1024); /* 8192 */
    	rlim.rlim_cur *=2;	/* On DOUBLE la taille de la pile */
    	setrlimit(RLIMIT_STACK,&rlim);
    	printf("Changed to         : %lu KiB\n",rlim.rlim_cur/1024); /* 16384 */
    	/* Décommenter la ligne qui suit pour une vérification */
    	//foo(sp); /* 16373 KiB */
     
    	return 0;
    }
    J'espère ne pas avoir dit trop de bêtises

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable publique dans main ?
    Par Magicien d'Oz dans le forum Langage
    Réponses: 13
    Dernier message: 13/07/2006, 11h40
  2. [Debutant]Exception NoClassDefFoundError dans main
    Par Mystnux dans le forum Langage
    Réponses: 4
    Dernier message: 17/06/2006, 12h24
  3. utilisation de malloc dans un fichier
    Par nemesys971 dans le forum C
    Réponses: 10
    Dernier message: 09/05/2006, 17h33
  4. Réponses: 5
    Dernier message: 15/09/2005, 14h05
  5. Réponses: 6
    Dernier message: 15/09/2005, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo