-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 回答