结构上的写入无效

时间:2017-10-05 02:28:20

标签: c malloc allocation

我正在尝试从一组单项式中创建一个多项式,其结构为两者。我有一个追加函数,由于无效的写入错误而失败,并知道我需要为新的单项式空间分配空间,但我不知道如何去做。任何帮助将不胜感激:

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

1 个答案:

答案 0 :(得分:0)

你离工作代码很远。

这不符合你的想法:

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内存中。这样可行,但除非您的编译器足够聪明以消除额外的副本,否则它会浪费。就这么简单。

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

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