结构上的无效写入
Invalid write on a structure
我正在尝试从一组单项式中创建一个多项式,并且两者都有一个结构。我有一个附加函数,由于无效的写入错误而失败,并且知道我需要为新的单项式分配 space,但我不确定如何去做。任何帮助将不胜感激:
typedef struct Monomial {
typede Monomial {
int coeff; /* coefficient */
int exp; /* exponent */
struct Monomial *next; /* next monomial */
} Mono;
typedef struct Polynomial {
int deg; /* degree */
Mono* first; /* first monomial */
Mono* last; /* last monomial */
} Poly;
此函数创建一个具有给定系数和幂的新单项式。
c:系数
k :功率
该函数分配一个单项式并初始化其属性。
return 值是指向新创建的单项式的指针。
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
此函数创建一个新的(空)多项式,次数为 0,没有
单项式。
Poly* newPoly() {
int deg = 0;
Mono * first = NULL;
Mono * last = NULL;
Poly p = {deg, first, last};
Poly * point= (Poly*)malloc(sizeof(p));
return point;
}
}
这个函数在多项式中添加了一个单项式
p:要修改的多项式
m :要添加的单项式
多项式 p 预计是 m 的唯一所有者。
新的单项式应添加到列表的末尾。
单项式的次数不能超过多项式的次数
void appendMono( Poly* p, Mono* m) {
if((*p).first){
Mono* l = (*p).last;
(*l).next = m; //ERROR IS HERE
(*p).last = m;
}
else {
(*m).next = (Mono*)malloc(sizeof(Mono));
(*p).first=m;
(*p).last=m;
}
}
此函数分配、读取和 returns 一个多项式。
它从询问最高学位开始
然后它读取所有的单项式(以递增的形式给出
幂次序)作为整数对(白色space分隔)
并将它们添加到多项式中。
它最终 return 构建了多边形。
Poly* readPoly() {
//TODO
Poly* p = newPoly;
int deg;
int pow, coef;
scanf("%d", °);
while(scanf("%d %d", &pow, &coef)){
Mono * m = newMono(pow, coef);
appendMono(p, m); //ERROR CALLED FROM HERE
}
return p;
}
你离工作代码还很远。
这和你想的不一样:
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
Malloc returns 未初始化的存储,所以这个函数 returns 垃圾。投malloc
的return值也是没用的。只需确保程序头中有 #include <stdlib.h>
。
试试这个:
Mono *newMono(int coeff, int exp) {
Mono *p = malloc(sizeof *p); // Check for NULL return in production code
p->coeff = coeff;
p->exp = exp;
p->next = NULL;
return p;
}
newPoly
遵循相同的模式。您显然是在尝试构建一个聚合,然后将其复制到 malloc
ed 内存中。这会起作用,但这是一种浪费,除非您的编译器足够聪明以消除额外的副本。直接做就行了。
要追加,不需要分配任何新的存储空间。你只是在调整指针。
void appendMono(Poly *p, Mono *m) {
if (p->first) {
p->last->next = m;
p->last = m;
} else {
p->first = p->last = m;
}
}
我正在尝试从一组单项式中创建一个多项式,并且两者都有一个结构。我有一个附加函数,由于无效的写入错误而失败,并且知道我需要为新的单项式分配 space,但我不确定如何去做。任何帮助将不胜感激:
typedef struct Monomial {
typede Monomial {
int coeff; /* coefficient */
int exp; /* exponent */
struct Monomial *next; /* next monomial */
} Mono;
typedef struct Polynomial {
int deg; /* degree */
Mono* first; /* first monomial */
Mono* last; /* last monomial */
} Poly;
此函数创建一个具有给定系数和幂的新单项式。 c:系数 k :功率 该函数分配一个单项式并初始化其属性。 return 值是指向新创建的单项式的指针。
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
此函数创建一个新的(空)多项式,次数为 0,没有 单项式。
Poly* newPoly() {
int deg = 0;
Mono * first = NULL;
Mono * last = NULL;
Poly p = {deg, first, last};
Poly * point= (Poly*)malloc(sizeof(p));
return point;
}
}
这个函数在多项式中添加了一个单项式 p:要修改的多项式 m :要添加的单项式 多项式 p 预计是 m 的唯一所有者。 新的单项式应添加到列表的末尾。 单项式的次数不能超过多项式的次数
void appendMono( Poly* p, Mono* m) {
if((*p).first){
Mono* l = (*p).last;
(*l).next = m; //ERROR IS HERE
(*p).last = m;
}
else {
(*m).next = (Mono*)malloc(sizeof(Mono));
(*p).first=m;
(*p).last=m;
}
}
此函数分配、读取和 returns 一个多项式。 它从询问最高学位开始 然后它读取所有的单项式(以递增的形式给出 幂次序)作为整数对(白色space分隔) 并将它们添加到多项式中。 它最终 return 构建了多边形。
Poly* readPoly() {
//TODO
Poly* p = newPoly;
int deg;
int pow, coef;
scanf("%d", °);
while(scanf("%d %d", &pow, &coef)){
Mono * m = newMono(pow, coef);
appendMono(p, m); //ERROR CALLED FROM HERE
}
return p;
}
你离工作代码还很远。
这和你想的不一样:
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
Malloc returns 未初始化的存储,所以这个函数 returns 垃圾。投malloc
的return值也是没用的。只需确保程序头中有 #include <stdlib.h>
。
试试这个:
Mono *newMono(int coeff, int exp) {
Mono *p = malloc(sizeof *p); // Check for NULL return in production code
p->coeff = coeff;
p->exp = exp;
p->next = NULL;
return p;
}
newPoly
遵循相同的模式。您显然是在尝试构建一个聚合,然后将其复制到 malloc
ed 内存中。这会起作用,但这是一种浪费,除非您的编译器足够聪明以消除额外的副本。直接做就行了。
要追加,不需要分配任何新的存储空间。你只是在调整指针。
void appendMono(Poly *p, Mono *m) {
if (p->first) {
p->last->next = m;
p->last = m;
} else {
p->first = p->last = m;
}
}