2012-11-28 1 views
1

J'essaie d'exécuter le code suivant, mais il me donne des données parasites sur l'accès aux valeurs du tableau struct. Pourquoi cela se passe-t-il et comment puis-je résoudre ce problème? Une fois que je déplace la partie malloc vers la fonction principale, cela semble fonctionner. Mais je veux garder le malloc dans une fonction séparée.Données de vidage imprimées lors de l'accès au tableau struct

#include <cstdlib> 
#include <limits> 
#include <iostream> 
using namespace std; 

/* 
* 
*/ 
typedef struct{ 
    float x; 
    float y; 
} CoordinateData; 

void tester(CoordinateData* cd_data){ 
    cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData)); 
    CoordinateData data = {41.2525,74.0744}; 
    *cd_data = data; 

} 
int main(int argc, char** argv) { 

    CoordinateData* cd_data; 
    tester(cd_data); 
    std::cout << (*cd_data).x << "::" << (*cd_data).y << std::endl; 
} 

La sortie je reçois est 2.42126e-39 :: - 1.51015e-05 Le résultat attendu est 41,2525 :: 74,0744

+1

Par curiosité, pourquoi êtes-vous allouer de la mémoire pour les 5 'CoordinateData'? – juanchopanza

+0

juste aléatoire. aucune raison – user949110

Répondre

3

passe cd_data par adresse, pas de valeur:

void tester(CoordinateData** cd_data) 
{ 
    *cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData)); 
    CoordinateData data = {41.2525,74.0744}; 
    *(*cd_data) = data; 
} 

int main(int argc, char** argv) 
{ 
    CoordinateData* cd_data = NULL; 
    tester(&cd_data); 
    std::cout << (*cd_data).x << "::" << (*cd_data).y << std::endl; 
    free(cd_data); 
    return EXIT_SUCCESS 
} 

Notez également, la valeur de retour de main() qui vous manquait. Aussi. cette question est marquée comme C et C++. Si c'est ce dernier, utilisez new et delete[] au lieu de malloc et free

2

Parce que la mémoire malloc attribue à une copie du pointeur que vous passez à votre fonction.
Le pointeur que vous passez à la fonction ne reçoit jamais de mémoire ou de données.

Vous devez Transmettre par référence.

//Call function as 
tester(&cd_data); 

//Function Implementation 
void tester(CoordinateData** cd_data) 
{ 
    *cd_data = (CoordinateData*)malloc(5*sizeof(CoordinateData)); 
    CoordinateData data = {41.2525,74.0744}; 
    *(*cd_data) = data; 
} 
+0

alors comment puis-je y accéder à partir de principal? – user949110

+0

@ user949110: de la même manière que précédemment, il suffit de passer l'adresse du pointeur et non le pointeur lui-même à la fonction. –