代码为什么出现了这个
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#define MAX 10
typedef int TY_data;
typedef struct quece
{
TY_data* a;
int front;
int rear;
}SqQueue;
void InitSqQueue(SqQueue* s);
void InitSqQueue(SqQueue* s)
{
s->a = (TY_data*)malloc(sizeof(TY_data) * MAX);
if (s->a == NULL)
{
exit(1);
}
s->front = 0;
s->rear = 0;
printf("创建成功\n");
return 0;
}
int Queuelength(SqQueue s);
int Queuelength(SqQueue s)
{
return (s.rear - s.front + MAX) % MAX;
}
void PutSqQueue(SqQueue*, TY_data);
void PutSqQueue(SqQueue* s, TY_data b)
{
if ((s->rear + 1) % MAX == s->front)
{
printf("队列已满\n");
return 0;
}
s->a[s->rear] = b;
s->rear = (s->rear + 1) % MAX;
printf("入队成功\n");
return 0;
}
TY_data PopSqQuece(SqQueue* s);
TY_data PopSqQuece(SqQueue* s)
{
if (s->front == s->rear)
{
printf("队列为空\n");
return 0;
}
TY_data a;
a = s->a[s->front];
s->front = (s->front + 1) % MAX;
printf("出队成功\n");
return a;
}
TY_data GetHead(SqQueue* s);
TY_data GetHead(SqQueue* s)
{
if (s->front == s->rear)
{
printf("队列为空\n");
return 0;
}
TY_data a = 0;
a = s->a[s->front];
return 0;
}
void DestroySqQuece(SqQueue* s)
{
free(s->a);
s->a = NULL;
printf("销毁成功\n");
}
int main()
{
SqQueue* j;
InitSqQueue(&j);
int ch[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
{
PutSqQueue(&j, ch[i]);
}
for (int i = 0; i < 5; i++)
{
int a;
a = PopSqQuece(&j);
printf("%d\n",a);
}
DestroySqQuece(&j);
return 0;
}
函数定义在前,不需要声明,函数定义在后,需要在前面声明
你这一个声明跟一个定义的写法看着真是强迫症发作
你这InitSqQueue函数问题多了
首先s根本没分配内存,你就先给s.a分配内存,s是野指针能不报错吗
其次s是指针,j也是指针,改变形参不改变实参,所以即使你给s赋值,j也不会变,你需要将s给return回去,要么把s定义成比j高一级的指针
现在它俩同级,而你却把一个的地址赋值给另一个,类型错误,这在更高级的IDE,比如vs里,根本不会允许你编译
该回答引用GPTᴼᴾᴱᴺᴬᴵ,具体如下:
根据代码提示的信息,可以看出这是一个 Debug Error,通常是由于程序访问了非法内存地址,比如使用了未初始化的指针,访问了已经释放的内存等。
在这段代码中,主函数中定义了一个 SqQueue 类型的指针 j,但是没有为其分配内存,所以当调用 InitSqQueue(&j) 时,实际上传递的是一个未初始化的指针,导致程序出错。要解决这个问题,需要使用 malloc 函数为 j 分配内存;同时,DestroySqQuece 函数中应该检查队列是否为空,避免释放已经释放的内存,修改后的完整代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef int TY_data;
typedef struct quece
{
TY_data* a;
int front;
int rear;
}SqQueue;
void InitSqQueue(SqQueue* s);
void InitSqQueue(SqQueue* s)
{
s->a = (TY_data*)malloc(sizeof(TY_data) * MAX);
if (s->a == NULL)
{
exit(1);
}
s->front = 0;
s->rear = 0;
printf("创建成功\n");
}
int Queuelength(SqQueue s);
int Queuelength(SqQueue s)
{
return (s.rear - s.front + MAX) % MAX;
}
void PutSqQueue(SqQueue*, TY_data);
void PutSqQueue(SqQueue* s, TY_data b)
{
if ((s->rear + 1) % MAX == s->front)
{
printf("队列已满\n");
return;
}
s->a[s->rear] = b;
s->rear = (s->rear + 1) % MAX;
printf("入队成功\n");
}
TY_data PopSqQuece(SqQueue* s);
TY_data PopSqQuece(SqQueue* s)
{
if (s->front == s->rear)
{
printf("队列为空\n");
return 0;
}
TY_data a;
a = s->a[s->front];
s->front = (s->front + 1) % MAX;
printf("出队成功\n");
return a;
}
TY_data GetHead(SqQueue* s);
TY_data GetHead(SqQueue* s)
{
if (s->front == s->rear)
{
printf("队列为空\n");
return 0;
}
TY_data a = 0;
a = s->a[s->front];
return 0;
}
void DestroySqQuece(SqQueue* s)
{
if (s->a) {
free(s->a);
s->a = NULL;
printf("销毁成功\n");
}
}
int main()
{
SqQueue* j = (SqQueue*)malloc(sizeof(SqQueue));
Init
如果以上回答对您有所帮助,望采纳~谢谢
C语言是传值的语言,传递的实参的拷贝,改变形参并不改变实参,若想对J做操作,需要形参为指向J的指针,即一个二级指针,直接修改J地址的值