正在静态链接到的库中调用函数 (C99)。
在测试中:
int ok =solve_equation(&eq, &result);
在poly.c中:
intsolve_equation(equation_integer_2 *eq,fraction *result) {...}
将指向结构变量“eq”的指针传递到函数中。当 gdb 进入函数时,结构体变量之一的值
eq->poly->term3->系数
与刚才不同。从调用代码到库,该值似乎已发生变化。这是正确的吗?是什么导致了这种变化?
Gdb 输出:
Breakpoint 1, test_solve_equation_1 () at tests.c:97
97 int ok = solve_equation(&eq, &result);
(gdb) p &eq->poly->term1->coefficient
$15 = (unsigned char *) 0x7fffffffd880 ""
(gdb) p &eq->poly->term2->coefficient
$16 = (unsigned char *) 0x7fffffffd890 "\002\001@"
(gdb) p &eq->poly->term3->coefficient
$17 = (unsigned char *) 0x7fffffffd8a0 ""
(gdb) s
solve_equation (eq=0x7fffffffd8f0, result=0x7fffffffd8d0) at poly.c:64
64 if (eq->poly->term1->coefficient == 0 && eq->poly->term3->coefficient == 0) {
(gdb) p &eq->poly->term1->coefficient
$18 = (unsigned char *) 0x7fffffffd880 ""
(gdb) p &eq->poly->term2->coefficient
$19 = (unsigned char *) 0x7fffffffd890 "\002\001@"
(gdb) p &eq->poly->term3->coefficient
$20 = (unsigned char *) 0x7fffffffd8a0 "\320\330\377\377\377\177"
term(n) 结构的构造如下:
void term_integer_factory(term_integer *t) |#include "number.h"
{ |
t->coefficient = 0; |typedef struct term_fraction
t->degree = 1; |{
}
最佳答案
正如 Daniel 和 user5329483 所暗示的那样,问题出在结构初始化中。函数内部有嵌套的结构初始化。我已将其更改为 malloc 所有相关结构(使用相应的 free
调用)并且它可以工作。
它的初始化是这样的:
void polynomial_integer_2_factory(polynomial_integer_2 *p)
{
term_integer t1;
term_integer_factory(&t1);
t1.degree = 2;
p->term1 = &t1;
term_integer t2;
term_integer_factory(&t2);
t2.degree = 1;
p->term2 = &t2;
term_integer t3;
term_integer_factory(&t3);
t3.degree = 0;
p->term3 = &t3;
}
现在它的初始化如下:
polynomial_integer_2* create_polynomial_integer_2()
polynomial_integer_2 *p = malloc(sizeof *p);
if (!p) {}
term_integer *t1 = create_term_integer();
t1->degree = 2;
p->term1 = t1;
term_integer *t2 = create_term_integer();
t2->degree = 1;
p->term2 = t2;
term_integer *t3 = create_term_integer();
t3->degree = 0;
p->term3 = t3;
return p;
}
关于进入库时更改结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601923/