c - 为什么`pLQ->tail`是一个空指针?
问题描述
我正在处理队列并不断遇到排队问题。这是我认为相关的代码:
typedef struct Qnode QNODE;
struct Qnode
{
int length;
QNODE* next;
QNODE* prev;
};
typedef struct lqueue lQUEUE;
struct lqueue
{
QNODE *head;
QNODE *tail;
};
lQueue lqueue_init_default(void)
{
lQUEUE* pQ = NULL;
pQ = (lQUEUE*)malloc(sizeof(lQUEUE));
if (pQ != NULL)
{
pQ->head = NULL;
pQ->tail = NULL;
}
pQ->head = pQ->tail;
return pQ;
}
Status lqueue_henqueue(lQueue* hLQ, int lc)
{
lQUEUE* pLQ = (lQUEUE*)hLQ;
QNODE* new = (QNODE*)malloc(sizeof(QNODE));
if (new == NULL)
{
printf("Couldn't allocate space.\n");
return FAILURE;
}
new->length = lc;
new->next = pLQ->tail->next;
pLQ->tail = new;
return SUCCESS;
}
每当我尝试运行程序时,都会在运行时收到此错误:
抛出异常:读取访问冲突。
pLQ->tail
是空指针。
为什么是空指针?它与初始化功能有关吗?
这是它的名称:
int cl = 0;//Individual car length
lQueue hLQ = lqueue_init_default();//Handle to the left queue
printf("Enter the length of the lcar:\n");
scanf("%d", &cl);
lqueue_henqueue(hLQ, cl);
解决方案
您的代码很容易出现未定义的行为......看看这个if
声明:
if (pQ != NULL)
{
pQ->head = NULL; // This pointer is now 'NULL'
pQ->tail = NULL; // This is also 'NULL'
}
这应该是哪个...
if (pQ != NULL)
{
pQ->head = (QNODE*)calloc(1, sizeof(lQUEUE)); // This is proper pointer initialization...
pQ->tail = (QNODE*)calloc(1, sizeof(lQUEUE));
}
和这个:
lQueue lqueue_init_default(void)
应该是这样的:
lQueue * lqueue_init_default(void) // Since you are returning a pointer...
您会看到代码运行良好,因为没有未定义的行为......
请注意,您永远无法访问分配给 NULL 的对象...(仅当您不希望您的程序行为未定义时...)所以,这个:
pQ->tail = NULL;
至少是不安全的...分配给
NULL
的结构指针通常仅在被销毁时才能看到...下面给出了一个示例...
此外,unrelated,但是有一个结构的析构函数并在您不再需要该结构时调用它,否则它会在之后泄漏内存......
void destroy_lqueue(struct lqueue ** queue)
{
if (queue != NULL)
queue = NULL;
free(queue);
}
推荐阅读
- reactjs - 如何防止 useEffect 中的函数被多次触发?
- python - matplotlib 动画,用于在单个图形中同步移动多个形状
- html - CSS初学者,需要帮助定位重叠的DIV
- ruby-on-rails - 删除枚举的默认值
- javascript - 渲染前获取数据 [React Native]
- php - 在博客存档页面上显示 ACF
- android-studio - Android Studio可以用aosp模拟器调试吗
- excel - Excel:按范围内的单元格计算多个字符
- react-native - OnPress 不起作用 React Native - Android
- python - pygame 没有显示任何内容,直到我关闭它