函数指针问题

时间:2013-06-14 17:55:22

标签: c

我遇到了使用错误参数的函数指针的问题。

代码中给我带来麻烦的部分就是这个

654     for (k = 0; k < o->nk; k++) {
655       val[0] = o->f(o->xyz+3*k, o->constant, o->f_cent, o->f_sig, val+1);
          ...
659     }

目标是调用一系列函数(其指针存储在o-> f中),每个函数在此循环中被称为o-> nk次。

o-> f的类型是

typedef double (*FLDfunc_t)(double x[], double A, double *ct, double *sig, double grd[]);

除最后一个(multsinfunc)外,所有函数都正常运行。 gdb的输出是:

#0  0x000000000048712f in multsinfunc (xyz=0x3923c55, A_in=6.28318530717958, cent_in=0x3568ad7, sig_in=0x3568b6e, grad=0x3243f6a879aff)
at MODELS/fields/functions.c:176
#1  0x00000000004863c2 in do_field_operation (o=0x7fffffffdde0, mdl=0x7ffff7e11010, l=CELL_C, kvar=4, kfrom=0, kto=8)
at MODELS/fields/fields.c:655

但是,当我进入“do_field_operation”时,参数的值是不同的:

gdb$ p o->xyz+3*k
$13 = (double *) 0x918150

gdb$ p o->constant
$14 = 1

gdb$ p o->f_cent
$15 = (double *) 0x880130

gdb$ p o->f_sig
$16 = (double *) 0x880148

结果是当我尝试在multsinfunc中访问“xyz”时出现分段错误。也许这很明显,但我不知道为什么会这样。一切似乎都被宣布正确。可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

您通过调用o->f传递了5个参数,但是 - 查看gdb输出 - do_field_operation有6个参数。通过不正确类型的函数指针调用函数会调用未定义的行为。