结构上的无效写入

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", &deg);
   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 遵循相同的模式。您显然是在尝试构建一个聚合,然后将其复制到 malloced 内存中。这会起作用,但这是一种浪费,除非您的编译器足够聪明以消除额外的副本。直接做就行了。

要追加,不需要分配任何新的存储空间。你只是在调整指针。

void appendMono(Poly *p, Mono *m) {
  if (p->first) {
    p->last->next = m;
    p->last = m;
  } else {
    p->first = p->last = m;
  }
}