为什么尝试添加到count和printf时会出现分段错误? #包括/*QueueTypes.h文件*/ #包括上文第1:15行中给出的/*是*/ #包括“QueueImplementation.c” 真空总管(真空){ 队列*que; ItemType*num; num=0; 初始化(que); 整数计数=0; 整数检查; int i; 如果(空(que)!=1){ 计数=计数+1; } printf(“%d”,计数);Front=NULL; Q->Rear=NULL; } /* -------------------- */ int空(队列*Q) { 返回(Q->Front==NULL); } /* -------------------- */ 整数满(队列*Q) {/*我们假设已经构造好的队列Q是*/ 返回0;/*未满,因为它可能会增长*/ }/*作为链接结构*/ /* -------------------- */ int Insert(项目类型R,队列*Q) { QueueNode*Temp; /*试图分配*/ Temp=(QueueNode*)malloc(sizeof(QueueNode));/*新节点*/ 如果(Temp==NULL){/*Temp=NULL信号分配*/ 系统错误(“系统存储已耗尽”);/*故障*/ 返回0; }否则{ 临时->项目=R; Temp->Link=NULL; 如果(Q->Rear==NULL){ Q->前端=温度; Q->后部=温度; }否则{ Q->后->链接=温度; Q->后部=温度; } } 返回1; } /* -------------------- */ int Remove(队列*Q,项目类型*F) { QueueNode*Temp; 如果(Q->Front==NULL){ 系统错误(“试图从空队列中删除项目”); 返回0; }否则{ *F=Q->正面->项目; 温度=Q->前部; Q->Front=Temp->Link; 免费(临时); 如果(Q->Front==NULL)Q->Rear=NULL; 返回1; } } /* -------------------- */
将指针传递到为什么尝试添加到count和printf时会出现分段错误? #包括/*QueueTypes.h文件*/ #包括上文第1:15行中给出的/*是*/ #包括“QueueImplementation.c” 真空总管(真空){ 队列*que; ItemType*num; num=0; 初始化(que); 整数计数=0; 整数检查; int i; 如果(空(que)!=1){ 计数=计数+1; } printf(“%d”,计数);Front=NULL; Q->Rear=NULL; } /* -------------------- */ int空(队列*Q) { 返回(Q->Front==NULL); } /* -------------------- */ 整数满(队列*Q) {/*我们假设已经构造好的队列Q是*/ 返回0;/*未满,因为它可能会增长*/ }/*作为链接结构*/ /* -------------------- */ int Insert(项目类型R,队列*Q) { QueueNode*Temp; /*试图分配*/ Temp=(QueueNode*)malloc(sizeof(QueueNode));/*新节点*/ 如果(Temp==NULL){/*Temp=NULL信号分配*/ 系统错误(“系统存储已耗尽”);/*故障*/ 返回0; }否则{ 临时->项目=R; Temp->Link=NULL; 如果(Q->Rear==NULL){ Q->前端=温度; Q->后部=温度; }否则{ Q->后->链接=温度; Q->后部=温度; } } 返回1; } /* -------------------- */ int Remove(队列*Q,项目类型*F) { QueueNode*Temp; 如果(Q->Front==NULL){ 系统错误(“试图从空队列中删除项目”); 返回0; }否则{ *F=Q->正面->项目; 温度=Q->前部; Q->Front=Temp->Link; 免费(临时); 如果(Q->Front==NULL)Q->Rear=NULL; 返回1; } } /* -------------------- */,c,list,queue,C,List,Queue,将指针传递到InitializeQueue()时,指针que尚未初始化 更好的实现可能是将指针que(即Queue**)传递到InitializeQueue() 这样称呼它 void InitializeQueue(Queue **Q) { *Q = malloc(sizeof**Q); // set aside memory for your queue Q->Front = NULL; Q->Rear = NULL; } 如果无法更改QueueImpleme
InitializeQueue()时,指针que
尚未初始化
更好的实现可能是将指针que
(即Queue**
)传递到InitializeQueue()
这样称呼它
void InitializeQueue(Queue **Q)
{
*Q = malloc(sizeof**Q); // set aside memory for your queue
Q->Front = NULL;
Q->Rear = NULL;
}
如果无法更改QueueImplementation.c
的实现,请在函数调用之前调用malloc
,如下所示:
Queue *que;
InitializeQueue(&que);
或者根本不使用堆分配(我的建议):
请注意,使用上述选项,que
只能在定义它的函数中合法访问。但是,这不应该影响您,因为您在main
中定义了它,因此它将在程序的生命周期内存在
对于这两个malloc
选项,请记住在使用完后调用free()
在将num
传递给Remove()
之前,您也无法在任何地方初始化它。你应该用同样的方法来修复它
您可以考虑使用调试器,如<代码> Valgnnd。分段错误并不总是发生在导致它的同一行代码中(如果它们发生的话),并且作为错误检查的一种方式可能不可靠
另外,使用if(Empty(que))
而不是if(Empty(que)!=1)
就足够了,因为表达式在计算为非零整数时为“真”。可以说它更安全,因为所有“真”值不必是1
p.p.S.不要包含.c
文件。包括.h
文件,并用主程序编译.c
文件。如果您使用的是gcc
,则
Queue que; // note that this is not a pointer
InitializeQueue(&que); // we have to take the address of it
其他编译器使用相同的语法(可能在某个地方有异常,但我没有遇到它)。在C中,当您只声明一个指针队列*
,它不会神奇地指向队列的一个新的“有效”实例。事实上,它指向内存中的一个随机位置,它很可能不包含任何对您有意义的内容
为了简化,您在代码中执行以下操作:
- 给我一个指针,我不管它指向哪里
- 将{NULL,NULL}放在指针指向的位置
因此,您正在将{NULL,NULL}写入系统内存的随机部分
你不是这样做的。看看Luddite提供的示例
此外,请阅读本文以了解此处发生的情况:
我怀疑是这些线路造成了SEG故障。能否提供QueueImplementation.c
的实现?分段错误不会出现在printf()
中,也不会出现在增加计数时。最可能的问题是您还不了解在QueueImplementation.c
中发生了什么。我将在中添加QueueImplementation.c,但当我去掉这些行时,程序工作正常。出现异常的原因是que
指针未初始化。查找“传递值”以获得解释。永远不要包含
实现(aka.c”)文件!我认为我无法更改QueueImplementation.c中的任何内容,因为它来自教科书上的问题。@Kyletrung然后在调用该函数之前初始化它。我修改了我的答案,以显示你是如何做到这一点的。好吧,它似乎是工作,虽然我有更多的错误在我的程序的其余部分修复。多谢各位@kyletruong如果这个答案对你有帮助,一定要点击分数下面的复选标记,将其标记为正确答案。好的,谢谢阅读。我需要继续在这方面教育自己。@kyle指针很棘手,真正理解它们需要时间。你在正确的道路上。
Queue *que;
InitializeQueue(&que);
Queue *que = malloc(sizeof*que);
InitializeQueue(que);
Queue que; // note that this is not a pointer
InitializeQueue(&que); // we have to take the address of it
gcc myprogram.c QueueImplementation.c