1

私が本質的にしようとしているのは、長さ n の配列を取り、たとえば長さ n-2 の配列を作成できる関数を作成することです。ここに私がこれまでに持っているコードがあります:

float* comp_arr(float vals[], int arr_size, float scale, float dim){

    int arr_dim = (int)(arr_size+1-2*scale);
    float curvs[arr_dim];

    for(int i = scale; i < sizeof(vals)-scale+1; i++){
            float cur = comp_cur((i-scale)*dim, vals[i-1], i*dim, vals[i], (i+scale)*dim, vals[i+1]);
            int new_index = (int)(i-scale);
            curvs[new_index] = cur;
            printf("%f\n",cur);
    }
    return curvs;
}

次のようにメイン関数で呼び出しています。

main(){
    float vals [] = {2,3,6,1,7};
    float *curvs = comp_arr(vals,5,1.0,1.0);
}

しかし、私はこのエラーが発生します:

comp.cpp: In function ‘float* comp_arr(float*, int, float, float)’:
comp.cpp:35:8: warning: address of local variable ‘curvs’ returned [enabled by default]
/tmp/ccrDJjYq.o: In function `comp_arr(float*, int, float, float)':
comp.cpp:(.text+0x590): undefined reference to `__cxa_end_cleanup'
/tmp/ccrDJjYq.o:(.ARM.extab+0xc): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

私はC ++にかなり慣れていません。何が間違っていますか?????

4

2 に答える 2

1

curvs配列は、comp_arr 関数内のローカル変数です。この関数が戻るとすぐに、使用していたメモリ (curvs配列を含む) が範囲外になるため、最初の警告がスローされます。メインで返された配列を参照すると、未定義の動作が発生します。関数から配列を返したい場合は、new/malloc を介して動的に割り当てる必要があります。

于 2013-02-12T18:59:04.787 に答える
0

ローカル変数へのポインタを返しています。関数の閉じ中括弧にcomp_arr到達するとすぐにcurvs、スコープ外になり、存在しなくなりますが、関数のアドレスを返します。データがまだメモリに存在する場合、プログラムは正しく動作する可能性がありますが、いつでも上書きされる可能性があります。

于 2013-02-12T18:58:50.880 に答える