2016-04-04 16 views
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大きいです。私はここで何が欠けていますか?

+3

「unsigned」へのキャストのように、そこのどこかに狭いタイプへの変換があるように見えます。 – EOF

+1

あなたが私たちを見せない何かが起こっているに違いありません。これ以上の情報がなければ、私たちの誰もがこの問題を再現することはできません。 –

+0

EOFが言ったこと。より自信を持って分析したい場合は、[mcve]を提示してください。 –

答えて

2

はおそらく、コールの時点での範囲にはプロトタイプがありません:

double* data = get_data(hdp); 

この場合、コンパイラは、関数がintを返すと仮定し、その戻り値を処理するための間違ったコードを生成します。

もしそうなら、少なくとも2つのエラーメッセージまたは警告メッセージが生成されるはずです - コンパイラ出力を確認してください。

関連する問題