【发布时间】:2016-10-09 04:30:33
【问题描述】:
我的函数 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)
该死,没有帮助。
【问题讨论】:
-
编码风格:通常,您希望 malloc 的内存拥有所有权,但这很可能不是问题所在。
-
我在您发布的代码中没有发现任何问题,但函数的其他地方可能存在问题。您能否将完整的代码发布到 neldermead?
-
您如何分配和填充
x[][]数组? -
你的函数在声明中有 5 个参数,你没有传递它们
-
最好整理一个简短的完整示例,因为问题可能出在您未显示的代码中。
标签: c calloc stack-smash