Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么尝试添加到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 - Fatal编程技术网

为什么尝试添加到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