2016-04-04 6 views
3

Ich habe eine Funktion, die eine double* erstellt und zurückgibt, aber die Position scheint sich zu ändern, nachdem ich es von der Funktion zurückgegeben habe, was zu einem seg-Fehler führt. die Adresse innerhalb der Funktion ist 0x100000000 größer ist als die Adresse außerhalb der FunktionC: malloc'ed Zeiger ändert seinen Standort, nachdem er von der Funktion zurückgegeben wurde?

void get_data_internal(double* data, int64_t* i, Factor* fctr) { 
    if (fctr->factor_type == DATA_PT) { 
     data[*i] = get_factor_data_pt(fctr); 
     (*i)++; 
    } 
    else { 
     stSetIterator* child_iter = stSet_getIterator(get_factor_children(fctr)); 
     Factor* child_fctr = stSet_getNext(child_iter); 
     while (child_fctr != NULL) { 
      get_data_internal(data, i, child_fctr); 
      child_fctr = stSet_getNext(child_iter); 
     } 
    } 
} 

double* get_data(HierarchicalDirichletProcess* hdp) { 
    int64_t data_length = hdp->data_length; 
    double* data = (double*) malloc(sizeof(double) * data_length); 

    int64_t i = 0; 
    stSetIterator* base_fctr_iter = stSet_getIterator(hdp->base_dp->factors); 
    Factor* base_fctr = stSet_getNext(base_fctr_iter); 
    while (base_fctr != NULL) { 
     get_data_internal(data, &i, base_fctr); 
     base_fctr = stSet_getNext(base_fctr_iter); 
    } 

    printf("returning data at address %p\n", data); 
    return data; 
} 

Das von

double* data = get_data(hdp); 
printf("receiving data at address %p\n", data); 

Welche

returning data at address 0x10c343000 
receiving data at address 0xc343000 

In jedem Fall druckt aufgerufen wird. Was fehlt mir hier?

+3

Sieht so aus, als hätten Sie irgendwo eine Konvertierung in einen schmaleren Typ (wie eine Umwandlung in "unsigned"). – EOF

+1

Es muss etwas passieren, dass du uns nicht zeigst. Es gibt keine Möglichkeit, dieses Problem ohne weitere Informationen zu reproduzieren. –

+0

Was EOF gesagt hat. Wenn Sie eine sicherere Analyse wünschen, dann präsentieren Sie eine [mcve]. –

Antwort

2

Vielleicht gibt es keinen Prototyp in ihrem Umfang an der Stelle des Aufrufs:

double* data = get_data(hdp); 

In diesem Fall wird der Compiler die Funktion liefert int und so erzeugt den falschen Code für den Umgang mit dem Rückgabewert annehmen würde.

Wenn ja, sollten mindestens zwei Fehler- oder Warnmeldungen generiert werden - überprüfen Sie Ihre Compiler-Ausgabe.

Verwandte Themen