我遇到了结构问题,我认为这是由不正确的mallocs引起的,或者可能是我的reallocs引起的。我尽可能地减少了代码,只显示了我认为相关的代码,因此几乎所有的实际操作都被省略了。
我的结构如下:
struct poly_t {
int nvars, *factor, *exp;
};
表现奇怪的价值是nvars
,这对我来说意味着我不知何故不能正确保留记忆。我所做的是我首先有一个创建和填充结构的函数,然后我有另一个函数,我发送其中两个结构并创建第三个相同的结构。在第三个结构中编辑nvars的值时,很少编辑第一个结构中的nvars值。运行gdb时,它会显示我在mul函数中执行thirdp->nvars++;
时发生的确切行。
所以使用这个函数,我创建了我的第一个和第二个结构(a
和b
)。
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
相同,为了清楚起见,我在此重新命名。
编辑:读取mul函数中的实际代码
答案 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;遗憾!