Inflearn Community Q&A
17.12) access violation
Written on
·
306
0
#pragma once
#include <stdbool.h>
#define TSIZE 45
#define MAX_SIZE 4 // array size
typedef struct element
{
char name[TSIZE];
} Item;
typedef struct queue
{
int front;
int rear;
int n_items;
Item items[MAX_SIZE];
} Queue;
void Init_queue(Queue* pq);
bool QueueIsFull(const Queue* pq);
bool QueueIsEmpty(const Queue* pq);
int QueueItemCount(const Queue* pq);
bool Enqueue(Item item, Queue* pq);
bool Dequeue(Item* pitem, Queue* pq);
void EmptyQueue(Queue* pq);
void TraverseQueue(Queue* pq);
void print_item(Item item);
#include "ArrayQueue.h"
#include <stdio.h>
#include <assert.h>
void Init_queue(Queue* pq)
{
pq->front = 0;
pq->rear = 0;
pq->n_items = 0;
}
bool QueueIsFull(const Queue* pq)
{
return (pq->rear + 1) % MAX_SIZE == pq->front;
}
bool QueueIsEmpty(const Queue* pq)
{
return pq->front == pq->rear;
}
int QueueItemCount(const Queue* pq)
{
return pq->n_items;
}
bool Enqueue(Item item, Queue* pq)
{
if (QueueIsFull(pq))
{
printf("Queue is Full.\n");
return false;
}
pq->rear = (pq->rear + 1) % MAX_SIZE;
pq->items[pq->rear] = item;
pq->n_items++;
return true;
}
bool Dequeue(Item* pitem, Queue* pq)
{
if (QueueIsEmpty(pq))
{
printf("Queue is Empty.\n");
return false;
}
pq->front = (pq->front + 1) % MAX_SIZE;
*pitem = pq->items[pq->front];
pq->n_items--;
return true;
}
void EmptyQueue(Queue* pq)
{
Init_queue(pq);
}
void TraverseQueue(Queue* pq)
{
for (int i = pq->front; i != pq->rear; i = (i + 1) % MAX_SIZE)
print_item(pq->items[(i + 1) % MAX_SIZE]);
}
void print_item(Item item)
{
printf('%s ', item.name);
}
#include <stdio.h>
#include <string.h>
#include "ArrayQueue.h"
Item get_item(const char* name);
void print_queue(Queue* pq);
int main()
{
Queue queue;
Item temp;
Init_queue(&queue);
Enqueue(get_item("Jack"), &queue);
print_queue(&queue);
Enqueue(get_item("Henry"), &queue);
print_queue(&queue);
Enqueue(get_item("Stan"), &queue);
print_queue(&queue);
Enqueue(get_item("Butters"), &queue); // capacity 4/3 fail
print_queue(&queue);
if (Dequeue(&temp, &queue))
printf("Item from queue : %s\n", temp.name);
print_queue(&queue);
if (Dequeue(&temp, &queue))
printf("Item from queue : %s\n", temp.name);
print_queue(&queue);
if (Dequeue(&temp, &queue))
printf("Item from queue : %s\n", temp.name);
print_queue(&queue);
if (Dequeue(&temp, &queue))
printf("Item from queue : %s\n", temp.name);
print_queue(&queue);
printf("====== Circulation Test ======");
Init_queue(&queue);
for (int i = 0; i < 10; ++i)
{
Enqueue(get_item("Hello"), &queue);
print_queue(&queue);
if (Dequeue(&temp, &queue))
printf("Item from queue : %s\n", temp.name);
print_queue(&queue);
}
return 0;
}
Item get_item(char* name)
{
Item new_item;
strcpy(new_item.name, name);
return new_item;
}
void print_queue(Queue* pq)
{
printf("Front : %d, Rear : %d, Size %d\n", pq->front, pq->rear, pq->n_items);
printf("Queue : ");
if (QueueIsEmpty(pq))
printf("Empty");
else
TraverseQueue(pq);
printf("\n\n");
}
순서대로 헤더, 헤더함수파일, 메인파일 입니다
디버깅시,
TraverseQueue함수 내의 print_item 함수가 실행되는 순간 access violation이 뜹니다
access violation 전까지는 값들 제대로 다 연산이 되다가
갑자기 print함수에서 저러니까 도저히 감이 안잡힙니다
방법이 없어 도움을 구합니다
Quiz
When comparing arrays and linked lists, which data structure is more efficient for data insertion or deletion?
Array
Linked list
Stack
Q
Answer 1
0
혹시 아래의 오류인가요?

관련 오류들을 검색해보니 해당 오류는 버퍼의 크기를 잘못 지정하거나
잘못된 주소를 참조하여 발생하는 오류인 것으로 보입니다.
https://m.blog.naver.com/dao8500/222112397866
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=onnelim7791&logNo=221550696178
TraverseQueue를
void TraverseQueue(Queue* pq) 로 customize하신 것으로 보이는데,
해당 코드의 주소에서 잘못된 주소 참조가 있는지 확인해보시거나
강의 내의 코드인
void TraverseQueue(Queue* pq, void (* func) (Item item)
형태로 맞춰보시겠어요?





