C语言队列代码无输出?为何malloc分配内存后可正常运行
为什么未分配内存的队列指针会导致程序异常退出?
我编写了一段实现队列的C语言代码,期望打印队列中的元素,但代码运行后直接退出,没有任何元素输出。当将代码中的struct queue *q;替换为struct queue *q=(struct queue *)malloc(sizeof(struct queue));后,代码可以正常工作,请问这是什么原因?
原代码:
#include <stdio.h> #include <stdlib.h> struct queue { int front; int rear; int size; int *arr; }; void enqueue(struct queue *q, int value) { if(q->rear!=q->size-1) { printf("Entry\n"); q->rear++; q->arr[q->rear] = value; } } int main() { struct queue *q; /*struct queue *q=(struct queue *)malloc(sizeof(struct queue));*/ q->front = -1; q->rear = -1; q->size = 10; q->arr = (int *)malloc((q->size) * sizeof(int)); enqueue(q,14); enqueue(q,7); enqueue(q,5); enqueue(q,4); enqueue(q,3); enqueue(q,2); for(int i=0;i<q->rear;i++){ printf("%d ",q->arr[i]); } return 0; }
原因解析:
- 野指针的本质:
struct queue *q;只是声明了一个指针变量,但没有给它赋值,此时q是一个野指针——它的值是内存中的随机垃圾数据,指向的是一块完全不确定的内存区域(可能是系统保护地址、其他进程的内存,或是无效地址)。 - 非法内存访问触发崩溃:当你执行
q->front = -1;这类操作时,相当于通过野指针去修改不属于程序的内存,这属于C语言中的未定义行为。程序大概率会直接触发内存访问错误,提前终止运行,根本没机会执行后续的入队和打印逻辑,所以你看不到任何输出。 - malloc的核心作用:
malloc(sizeof(struct queue))会从堆内存中分配一块刚好能容纳struct queue结构体的合法内存空间,并返回这块空间的起始地址。把这个地址赋值给q后,q就变成了指向有效内存的合法指针,后续对q的成员(front、rear等)的读写操作都是在这块程序拥有权限的内存中进行,自然能正常执行。
额外小问题提示:
原代码的打印循环条件i<q->rear存在逻辑错误:入队6次后q->rear的值是5(初始为-1,每次入队+1),循环会只打印arr[0]到arr[4],漏掉最后一个元素arr[5],建议改成i<=q->rear。
内容的提问来源于stack exchange,提问作者Kapil Kushwaha
相关产品推荐
相关产品推荐

