C 函数指针问题

C 函数指针问题,c,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 } 除最后一个函数(multsinfunc)外,所有函数均正常运行。gdb的输出为: #0 0x0000

我遇到了一个函数指针问题,它使用了错误的参数

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

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     }
除最后一个函数(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”时,出现了一个分段错误。也许这是显而易见的,但我不知道为什么会这样。一切似乎都申报妥当了。这可能是什么原因造成的?

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

可能
xyz+3*(o->nk-1)
超出范围。但是这只是一个猜测,但是调用
o->f
的是
do\u field\u操作。我想我明白了<代码>->
()
具有相同的优先级。在(o->f)周围添加一些括号似乎可以解决这个问题,尽管我的K&R手册说它们会“从左到右”关联,所以
o->f
应该首先计算。这也不能解释为什么其他函数指针没有错误。
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