#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