C-在结构上写入无效



我正在尝试从一组单一的多项式创建一个多项式,并具有两者的结构。我的附录函数由于写入错误而导致失败,并且知道我需要为新单元分配空间,但不确定如何处理。任何帮助将不胜感激:

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:力量 该函数分配了单个函数并初始化其属性。 返回值是指向新创建的单元的指针。

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;
   }
}

此函数分配,读取和返回多项式。 首先要问最高学位 然后它读取所有单元(以增加 权力命令)作为整数成对(分离的空格) 并将它们添加到多项式中。 它最终返回构造的poly。

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返回非初始化的存储,因此此功能返回垃圾。施放malloc的返回值也是没有用的。只需确保您的程序主管中有#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;
  }
}

相关内容

  • 没有找到相关文章

最新更新