Я создал код, в котором вызывается malloc()
, но он возвращает нулевой указатель. Когда я вызываю тот же malloc()
в main()
и перехожу к функции, она работает совершенно нормально. Поэтому, пожалуйста, скажите мне, в чем проблема.
Вот мой код. У меня проблемы с malloc()
в функции reverse()
. malloc()
в других функциях работают нормально. Итак, почему есть проблема с той, что в этой функции. У меня достаточно памяти на компьютере, так что проблема точно не в этом.
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} SNode;
typedef struct
{
int count;
SNode *top;
} Stack;
int isSEmpty(Stack *s)
{
return (s->count==0);
}
void push(Stack *s, int x)
{
SNode *temp = (SNode *)malloc(sizeof(SNode));
temp->data = x;
temp->next = s->top;
s->top = temp;
s->count++;
}
int pop(Stack *s)
{
if (isSEmpty(s))
{
printf("Underflow");
return -1;
}
SNode *temp = s->top;
s->top = s->top->next;
int t = temp->data;
free(temp);
s->count--;
return t;
}
typedef struct qnode
{
int data;
struct qnode *next, *prev;
} QNode;
typedef struct
{
QNode *front, *rear;
int count;
} Queue;
int isQEmpty(Queue *q)
{
return (q->count==0);
}
void enQueue(Queue *q, int x)
{
QNode *temp = (QNode *)malloc(sizeof(QNode));
temp->data = x;
temp->prev=q->rear;
temp->next = NULL;
q->rear->next = temp;
q->rear = temp;
q->count++;
if (q->count==1)
{
q->front = q->rear;
}
}
int deQueue(Queue *q)
{
if (isQEmpty(q))
{
printf("Underflow");
return -1;
}
QNode *temp = q->front;
q->front = q->front->next;
int t = temp->data;
free(temp);
q->count--;
return t;
}
void reverse(Queue *q)
{
Stack *s = (Stack *)malloc(sizeof(Stack));
s->count = 0;
while (!isQEmpty(q))
{
push(s, deQueue(q));
}
while (!isSEmpty(s))
{
enQueue(q, pop(s));
}
}
int main()
{
char p = 'y';
Queue *q = (Queue *)malloc(sizeof(Queue));
q->count = 0;
while (p =='y')
{
printf("Enter data to be Enqueued: ");
int d;
scanf("%d", &d);
enQueue(q, d);
printf("Do you want to enter more data? y/n:");
scanf(" %c", &p);
}
printf("Original queue Front: %d Rear: %d\n", q->front->data, q->rear->data);
reverse(q);
printf("Reversed queue Front: %d Rear: %d", q->front->data, q->rear->data);
return 0;
}
У вас есть несколько
malloc
здесь. Какой из них возвращает 0?Откуда вы знаете, что
malloc
возвращаетNULL
, если вы его не проверяете? Обычноmalloc
возвращаетNULL
, если памяти больше нет.Отформатируйте свой код правильно, особенно если вы хотите/нужно, чтобы другие его прочитали.
@HolyBlackCat я указал в вопросе, тот, что в обратной функции
@Pablo Я удалил оператор проверки при публикации кода, поскольку он не является частью основного кода.
Пардон, я этого не заметил. Тогда можете ли вы добавить чек обратно, чтобы мы могли быть уверены, что он не сломан? Кроме того, вы уверены, что не вызываете
malloc
абсурдное количество раз, прежде чем он вернет0
?@IharobAlAsimi Я отформатировал его. он не отформатировался после того, как я скопировал и вставил его.
Есть format.krzaq.cc (но я не уверен, как форматирование могло сломаться при копировании из IDE).
@HolyBlackCat этот чек не имеет большого значения. только что использованный if(s==NULL) напечатать что-то после malloc. ну, я не думаю, что malloc называют абсурдным количеством раз, всего 2-3. и даже тогда у меня 8 гб оперативной памяти. он не будет заполнен путем выделения байтов
@Gameatro Это потому, что у вас были вкладки вместо пробелов для отступов. И некоторые другие вещи просто так, как вы форматируете это неправильно (ИМХО). Стиль — это то, что вы можете выбрать, но, конечно, есть и плохие варианты.
@Gameatro «эта проверка не имеет большого значения» - если ваша проверка на ноль показывает вам, что ваш код дает сбой, вам нужно включить ее в минимальный воспроизводимый пример. Достаточно часто здесь случается, что кто-то уверен, что он правильно проверил нулевое значение, но случайная запятая или отсутствующий знак равенства или что-то еще приводит к тому, что проверка идет наперекосяк. Не говоря, что это была ваша проблема, просто говоря, что это важная часть вашей программы, если так было, когда она потерпела неудачу.