2010-12-14 97 views
0

Je déclare une variable globale dans mon programme:passage des tableaux aux fonctions par leurs noms dans C

double mat[3200][3200]; 

lors du passage de ce tableau à fwrite() en utilisant le nom de la variable comme argument, je reçois un dépassement de pile jeté à l'exécution.

fwrite(mat, sizeof(double), 3200*3200, fid); 

Pourquoi est-ce? Le compilateur ne devrait-il pas remplacer le mat variable par un pointeur sur son premier élément? J'ai lu here et here, et je n'arrive toujours pas à comprendre

+3

Incluez le code dans lequel vous initialisez le tableau et appelez 'fwrite()'. –

Répondre

1

Une erreur de dépassement de pile peut être due à une récursion infinie (improbable dans votre exemple) ou à un trop grand nombre de données transmises sur la pile (paramètres). Il semble que votre tableau est passé par copie, pas par adresse.

Vous pouvez essayer de remplacer l'appel par

fwrite(&(mat[0][0]), sizeof(double), 3200*3200, fid); 

Un tableau statique n'est pas un pointeur.

+0

Salut jv42, C'est exactement ma question: pourquoi mon tableau est-il passé en valeur? Votre solution est une bonne solution de contournement, tho. – liorda

+0

Eh bien, c'est quelque chose à citer de la spécification du langage C. Un tableau statique (ie un tableau avec une taille fixe) n'est pas équivalent à un pointeur sur son premier élément, il est géré différemment par le compilateur C. – jv42

+0

Êtes-vous sûr de cette distinction? AFAIK, le nom d'une variable de tableau est converti en un pointeur vers le premier élément chaque fois qu'il est appelé un rvalue. Malheureusement, je n'ai pas de copie de la norme C à portée de main. – Praetorian

1

Le tableau est-il créé sur la pile? Par exemple, créez-vous le tableau comme ceci?

void foo() 
{ 
    double mat[3200][3200]; 

    // ... other stuff 

    fwrite(mat, sizeof(double), 3200*3200, fid); 
} 

Si oui, êtes-vous sûr qu'il est fwrite et non la déclaration de tableau lui-même qui est à l'origine du débordement de la pile? Le tableau occupe 3200 * 3200 * 8 = 81920000 octets (environ 78 Mio), probablement un peu trop grand pour une allocation de pile. Essayez le malloc à la place.

+0

Hi Prétorien, la variable est globale, c'est-à-dire déclarée dans la portée la plus extérieure, et je crois qu'elle est allouée sur la pile. – liorda

+1

Les variables globales doivent être en mémoire statique, ce qui n'est pas dans la pile. Donc ce n'est pas le problème. –

+0

@liorda: Les données globales ne sont pas créées sur la pile, elles sont créées dans une section définie par l'implémentation telle que '.bss' ou' .data'. Lorsque vous parlez de portée externe, voulez-vous dire dans 'main()' ou une autre fonction, ou en dehors de toute fonction au niveau du fichier? – Praetorian

0

Je suppose que la variable a été transmise (en utilisant la pile) par valeur. Merci à tous d'avoir essayé de m'aider à comprendre cela.