3
私はdouble*
を作成して返す関数を持っていますが、関数から返すと位置が変わってしまい、segフォールトが発生します。C:関数から返された後、mallocされたポインタが場所を変更しますか?
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;
}
これは、全ての場合において
returning data at address 0x10c343000
receiving data at address 0xc343000
を印刷
double* data = get_data(hdp);
printf("receiving data at address %p\n", data);
から呼び出される、関数内のアドレスが関数外部アドレスより0x100000000大きいです。私はここで何が欠けていますか?
「unsigned」へのキャストのように、そこのどこかに狭いタイプへの変換があるように見えます。 – EOF
あなたが私たちを見せない何かが起こっているに違いありません。これ以上の情報がなければ、私たちの誰もがこの問題を再現することはできません。 –
EOFが言ったこと。より自信を持って分析したい場合は、[mcve]を提示してください。 –