【问题标题】:Stack Smashing when returning pointer to array返回指向数组的指针时堆栈粉碎
【发布时间】: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


【解决方案1】:

功能

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

接受参数。当函数返回时,它会清理堆栈。它期望参数已经被压入堆栈。

你调用它:

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

您没有将参数传递给函数。返回时返回错误地址。

【讨论】:

  • 不,neldermead 调用 function1 以获得各种 int 值。
猜你喜欢
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多