Не удается решить необработанное исключение в Visual Studio 2019

#c

#c

Вопрос:

Меня попросили создать связанный список для создания и отображения многочленов, однако код переходит к части экспоненты без принятия части коэффициента и выдает необработанное исключение — нарушение доступа при попытке записи 0xCDCD . (Я очень новичок в программировании, поэтому, пожалуйста, будьте проще со мной, объясняя, что нужно сделать).

Код

     #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    struct node
    {
        int coeff, expo;
        struct node* next;
    };

    struct node*head,*temp,*save;
    void create(int x);
    void display(); 
    void main()
    {   
      int  n=0,ch=0;
      printf("enter the highest degree of the polynomial you want to create");
      scanf_s("%d", amp;n);
      printf("nenter the polynomial (coefficeint followed by the exponential of variable in descending order)");
      create(n);
      printf("nthe polynomial now is");
      display();
    }

    void create(int x)
    {
      printf("n enter degree %d(coeffecient)", x);
      printf("n enter degree %d(exponent)", x);

      head = (node*)malloc(sizeof(node));
      if (head == NULL)
      {
        printf("n cannot allocate memory");
      }
      else
      {
        scanf_s("%d", head->coeff);
        scanf_s("%d", head->expo);
      }

      save = head;
      while (x>0)
      {
        save->next = temp = (node*)malloc(sizeof(node));
        if(temp==NULL)
        {
            printf("n cannot allocate memory");
        }
        else
        {
            printf("n enter degree %d(coeffecient)", x-1);
            printf("n enter degree %d(exponent)", x-1);
            scanf_s("%d", head->coeff);
            scanf_s("%d", head->expo);
            save = temp;
            x--;
        }
      } 
    }

    void display()
    {
      temp = head;
      while(temp!=NULL)
      {
        printf("n%dx^%d", temp->coeff, temp->expo);
        temp = temp->next;
      }
    }
  

Комментарии:

1. Вы компилируете с помощью компилятора C ? head = (node*)malloc(sizeof(node)); должно вернуть ошибку. Кроме того, вам не нужны temp и save , head достаточно для сохранения списка.

2. @P__J__ поскольку я новичок на сайте, я не понимаю, что вы имеете в виду, не могли бы вы уточнить?

3. @DavidRanieri Я использую локальный отладчик Windows для большинства своих программ, поскольку я занимаюсь только легким программированием. Здесь, однако, я попытался запустить с head = (struct node*)malloc(sizeof(struct node)); только для того, чтобы результат был таким же . Я не хотел случайно потерять начальный адрес, поэтому в основном оставляю head нетронутым.

4. scanf_s нужны указатели, должны быть scanf_s("%d", amp;head->coeff); и scanf_s("%d", amp;head->expo); …. Я не хотел случайно потерять начальный адрес, поэтому я в основном оставляю head нетронутым ммм… проще случайно потерять адрес, используя ваш подход.

5. @DavidRanieri о, мой плохой, я буду иметь это в виду, большинство людей в моем классе делают то же самое и приводят ту же причину, по которой head в основном следует оставить нетронутым, чтобы сохранить адрес, я, безусловно, постараюсь провести дополнительные исследования по этому вопросу

Ответ №1:

По крайней мере, одна ошибка:

 scanf_s("%d", head->coeff);
scanf_s("%d", head->expo);
  

необходимо

 scanf_s("%d", amp;head->coeff);
scanf_s("%d", amp;head->expo);
  

Чтобы убедиться, что вы передаете указатель на значение, которое хотите заполнить.

Вам также необходимо установить для новых элементов next значение NULL , чтобы вы могли просматривать свой список. malloc не дает вам очищенной памяти, и IIRC VS намеренно установит для выделенной памяти фиктивное значение в режиме отладки, чтобы помочь устранить ошибку, с которой вы столкнулись.

Комментарии:

1. большое вам спасибо, предупреждения уменьшились, но теперь в printf присутствует нарушение доступа (» n% dx ^% d», temp-> coeff, temp-> expo); как вы сказали, несколько ошибок были удалены: D