-4

私の関数neldermeadは次のようになります。

double * neldermead (double data[], double (*function)(int, double, double, double, double, double),
double ia1, double ia2, double ia3, double ia4, double ia5, double rad, int k) {

...

printf("8\n");
double * xout = malloc(5 * sizeof(double));

xout[0] = x[0][0];  
xout[1] = x[1][0]; 
xout[2] = x[2][0];  
xout[3] = x[3][0];  
xout[4] = x[4][0];

printf("10\n");  
return xout;
}

関数は次のように呼び出されます。

...
double * newX;
printf("11\n");  
newX = neldermead (data,  &function1, F1A1, F1A2, F1A3, F1A4, F1A5, 10, 10000);
printf("12\n");  
...

出力は次のとおりです。

11
8
10
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

-fno-stack-protectorを使用すると、コードは正常に動作します。

配列を返す方法に何か問題がありますか?

///////////////////////////////////

参照渡しを行うようにコードを修正しました。

私の関数neldermeadは次のようになります。

double * neldermead (double * xout, double data[], double (*function)(int, double, double, double, double, double),
double ia1, double ia2, double ia3, double ia4, double ia5, double rad, int k) {

...

printf("8\n");


xout[0] = x[0][0];  
xout[1] = x[1][0]; 
xout[2] = x[2][0];  
xout[3] = x[3][0];  
xout[4] = x[4][0];

printf("9\n");  

}

関数は次のように呼び出されます。

...
double newX[5];
printf("10\n");  
neldermead (newX, data,  &function1, F1A1, F1A2, F1A3, F1A4, F1A5, 10, 10000);
printf("11\n");  
...

出力は次のとおりです。

10
8
9
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

くそー、役に立たなかった。

4

1 に答える 1

0

関数

 double (*function)(int, double, double, double, double, double)

パラメータを取ります。関数が戻ると、スタックがクリーンアップされます。パラメータがスタックにプッシュされていることを期待しています。

次のように呼び出します。

newX = neldermead (data,  &function1, F1A1, F1A2, F1A3, F1A4, F1A5, 10, 10000);

関数にパラメータを渡していません。戻ってきたら間違った住所に戻ってきます。

于 2016-10-09T05:30:16.877 に答える