基本上我所要做的就是将某个(多项式)分配给给定索引处的动态数组,覆盖其中的任何内容。为简单起见,我只是使subtract()返回指向polynomialArray中第一个元素的指针。所以,这段代码应该复制第一个元素的内容并替换另一个元素(我知道需要深层复制,并且这是在减法中实现的)。我被Java宠坏了(你们好心人)...
当我在它被复制到的索引上打印时,那里什么也没有。
通常会打印Poly1 = 2x^3 + 4x
之类的内容,但只打印Poly1 =
。
编译正常并运行,但不执行我需要的操作。编辑:如果该索引没有任何内容,则运行正常。如果索引处有某些内容,则会出现错误。
//Portion of main from another file
Polynomial* subtracted = subtract(op1_index, op2_index);
insert(subtracted, diff_index);
printPolynomial(diff_index);
//Methods in question (utils file)
void insert(Polynomial* element, int index) {
if(index > num_polynomial) {
polynomialArray = (Polynomial*)realloc(polynomialArray, (index + 1) * sizeof(Polynomial));
}
free(polynomialArray[index].polynomialTerm);
polynomialArray[index] = *element; // Problem here?
}
Polynomial* subtract(int op1_index, int op2_index) {
return &polynomialArray[0];
}
//Typedefs accessible in main and utils file
typedef struct term {
int exponent;
int coefficient;
} Term;
typedef struct polynomial {
Term *polynomialTerm;
} Polynomial;
//variables accessible in utils file
static Polynomial *polynomialArray;
int num_polynomial; // counter to keep track of the number of polynomials
答案 0 :(得分:1)
我认为问题出在free(polynomialArray[index].polynomialTerm);
,如果索引> num_polynomial,那么这里的值polynomialArray[index].polynomialTerm
是垃圾。你不需要释放它。相反,你应该写这样的东西:
void insert(Polynomial* element, int index) {
if(index >= num_polynomial) { /* probably should be >= depends on your implementation */
polynomialArray = (Polynomial*)realloc(polynomialArray, (index + 1) * sizeof(Polynomial));
}
else
{
free(polynomialArray[index].polynomialTerm);
}
polynomialArray[index] = *element;
}
另外,这有点风险。主要有两个原因:
num_polynomial
和新大小之间的任何东西,你会到达未知区域,并且可能再次遇到段错误。答案 1 :(得分:0)
我认为问题是subtract
正在向动态分配的数组返回一个指针,然后insert
realloc的那个数组,留下通过subtract返回的指针(作为{{1}传递给insert晃来晃去。
因此,在标记为element
的行上,element指向刚刚隐式释放的(通过realloc)数组,该数组可能已被内存管理系统覆盖。在任何情况下,在释放后访问内存都会产生未定义的行为。