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?
Sieht so aus, als hätten Sie irgendwo eine Konvertierung in einen schmaleren Typ (wie eine Umwandlung in "unsigned"). – EOF
Es muss etwas passieren, dass du uns nicht zeigst. Es gibt keine Möglichkeit, dieses Problem ohne weitere Informationen zu reproduzieren. –
Was EOF gesagt hat. Wenn Sie eine sicherere Analyse wünschen, dann präsentieren Sie eine [mcve]. –