在另一个函数

时间:2015-10-02 08:56:11

标签: c struct

我遇到了结构问题,我认为这是由不正确的mallocs引起的,或者可能是我的reallocs引起的。我尽可能地减少了代码,只显示了我认为相关的代码,因此几乎所有的实际操作都被省略了。

我的结构如下:

struct poly_t {
    int nvars, *factor, *exp;
};

表现奇怪的价值是nvars,这对我来说意味着我不知何故不能正确保留记忆。我所做的是我首先有一个创建和填充结构的函数,然后我有另一个函数,我发送其中两个结构并创建第三个相同的结构。在第三个结构中编辑nvars的值时,很少编辑第一个结构中的nvars值。运行gdb时,它会显示我在mul函数中执行thirdp->nvars++;时发生的确切行。

所以使用这个函数,我创建了我的第一个和第二个结构(ab)。

poly_t* new_poly_from_string(const char* a){
    struct poly_t* p = malloc(sizeof(struct poly_t));
    p->nvars = 0;
    p->factor = malloc(strlen(a) * sizeof(int));
    p->exp = malloc(strlen(a) * sizeof(int));
    for (int i = 0; i < strlen(a); i++){
        //do stuff to put a into p, using at most p->factor[p->nvars] and the same for p->exp
    p->factor = realloc(p->factor, p->nvars*sizeof(int));
    p->exp = realloc(p->exp, p->nvars*sizeof(int));
    printf("%d", p->nvars); //At this point, nvars is the correct value
    return p;
}

以下是适用于9/10案例的功能,但在极少数情况下它并不适用。我已用箭头a->nvars标记了更改-->的确切行。

poly_t* mul(poly_t* a, poly_t* b){
    struct poly_t* thirdp = malloc(sizeof(struct poly_t));
    thirdp->nvars = 0;
    thirdp->factor = malloc((a->nvars + b->nvars) * sizeof(int));
    thirdp->exp = malloc((a->nvars + b->nvars) * sizeof(int));
    for (int i = 0; i < a->nvars; i++){
        for (int j = 0; j < b->nvars; j++){
            for (int k = 0; k < p->nvars; k++){
                if (p->exp[k] == a->exp[i] + b->exp[j]){
                    p->factor[k] += a->factor[i]*b->factor[j];
                    found = 1;
                    break;
                }
            }
            if (!found){
                p->factor[p->nvars] = a->factor[i]*b->factor[j];
                p->exp[p->nvars] = a->exp[i] + b->exp[j];
-->             p->nvars++; //This is the row that changes a->nvars according to gdb
            }
        }
    }

    return thirdp;
}

这是我在尝试找出正在发生变化的a->nvars时运行gdb时得到的结果。请注意,p与上面的thirdp相同,为了清楚起见,我在此重新命名。

GDB output

编辑:读取mul函数中的实际代码

2 个答案:

答案 0 :(得分:3)

您正在为整数数的总和分配空间

 a->nvars + b->nvars

我不知道你在做什么

//fill thirdp->factor and thirdp->exp

当你嵌套for循环时,我怀疑你可能正在生成

  a->nvars * b->nvars  //multiply

项目,因此在分配的空间结束时运行。您现在向我们展示代码,我们看到了

    if (!found){
        // --- here ----
        p->factor[p->nvars] = a->factor[i]*b->factor[j];
        p->exp[p->nvars] = a->exp[i] + b->exp[j];
        p->nvars++;
    }

在我标记这里的那一刻你应该检查p-&gt; nvars的值,我认为它有可能达到大于(a-> nvars + b-&gt;的值; nvars)

我认为安全地为(a-&gt; nvars * b-&gt; nvars)整体分配空间。

答案 1 :(得分:0)

问题就在于我相信mallocs。具体是以下两行:

thirdp->factor = malloc((a->nvars + b->nvars) * sizeof(int));
thirdp->exp = malloc((a->nvars + b->nvars) * sizeof(int));

我根本没有分配足够的内存导致奇怪的行为。我想要的是:

thirdp->factor = malloc((a->exp[0] + b->exp[0]) * sizeof(int));
thirdp->exp = malloc((a->exp[0] + b->exp[0]) * sizeof(int));

不幸的是,因为我没有给出任何indata或者很多背景,所以你们可能无法想象出来&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;。&lt;遗憾!