进入库时更改结构值

标签 c gcc

正在静态链接到的库中调用函数 (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/

相关文章:

c - 关于C动态内存分配的练习

c - 使用 ATTiny 和 Atmel Studio 处理 32 位数字

c - 原子比较(不等于)和交换

c - arm-linux-gnueabi-gcc 找不到库

c++ - 错误 LNK2019 : unresolved external symbol

c++ - 为矩阵赋值时的奇怪行为 (C/C++)

c# - 在代码隐藏中调用 javascript

c - 为什么 a=(b++) 与 a=b++ 具有相同的行为?

xcode - 是否有 gcc/Xcode pragma 来抑制警告?

c - OpenBSD 上的 <resolv.h> 给出不完整的类型错误