循环队列Segmentation fault的产生原因

请问为什么循环队列这段代码会爆出Segmentation fault的错误啊?

#include 
#include 

using namespace std;

struct elem
{
    int *arr;
    int maxSize;
    int front,rear;
};
void create(elem *p,int a)
{
    p->arr=new int [a];
    p->maxSize=a;
    p->front=p->rear=0;
}
void clear(elem *p)
{
    delete [] p->arr;
}

bool isEmpty(elem *p)
{
    return p->front==p->rear;
}
void doubleSpace(elem *p)
{
    int *tmp=p->arr;
    p->arr=new int [2*(p->maxSize)];
    for (int i=1;imaxSize;++i) p->arr[i]=tmp[(p->front+i)%p->maxSize];
    p->front=0;p->rear=p->maxSize-1;
    (p->maxSize)*=2;
    delete tmp;
}
void deQueue(elem *p)
{
    if(!isEmpty(p))
    {p->front = (p->front+1)%p->maxSize;
    cout << p->front <<' '<rear)-(p->front))<else {
        cout << p->front <<' '<rear)-(p->front))<void enQueue(elem *p,int i)
{   if((p->rear+1)%p->maxSize==p->front) doubleSpace(p);
    p->rear=(p->rear+1)%p->maxSize;
    p->arr[p->rear]=i;
  cout << p->rear <<' '<rear)-(p->front))<int getHead (elem *p)
{
    return p->arr[(p->front+1)%p->maxSize];
}

int main()
{   elem *p;



    int m,n,b;
    cin >> m >> n;
    create (p,m);
    b=n;
    while (b-->0)
    {
        int i;
        cin>>i;
        switch(i){
        case 0: int x;
        cin>>x;
        enQueue(p,x);break;
        case 1:deQueue(p);break;
        }
    }
    clear (p);
    return 0;

}


基于Monster 组和GPT的调写:

#include <iostream>
#include <cmath>
 
using namespace std;
 
struct elem
{
    int *arr;
    int maxSize;
    int front,rear;
};
void create(elem *p,int a)
{
    p->arr=new int [a];
    p->maxSize=a;
    p->front=p->rear=0;
}
void clear(elem *p)
{
    delete [] p->arr;
}
 
bool isEmpty(elem *p)
{
    return p->front==p->rear;
}
void doubleSpace(elem *p)
{
    int *tmp=p->arr;
    p->arr=new int [2*(p->maxSize)];
    for (int i=1;i<p->maxSize;++i) p->arr[i]=tmp[(p->front+i)%p->maxSize];
    p->front=0;p->rear=p->maxSize-1;
    (p->maxSize)*=2;
    delete[] tmp;
}
void deQueue(elem *p)
{
    if(!isEmpty(p))
    {
        p->front = (p->front+1)%p->maxSize;
        cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
    }
    else {
        cout << p->front <<' '<<abs((p->rear)-(p->front))<<endl;
    }
}
void enQueue(elem *p,int i)
{   
    if((p->rear+1)%p->maxSize==p->front) doubleSpace(p);
    p->rear=(p->rear+1)%p->maxSize;
    p->arr[p->rear]=i;
    cout << p->rear <<' '<<abs((p->rear)-(p->front))<<endl;
}
int getHead (elem *p)
{
    return p->arr[(p->front+1)%p->maxSize];
}
 
int main()
{   
    elem q;
    elem *p=&q;
 
    int m,n,b;
    cin >> m >> n;
    create(p, m);
    b=n;
    while (b-->0)
    {
        int i;
        cin>>i;
        switch(i){
        case 0: 
            int x;
            cin>>x;
            enQueue(p,x);
            break;
        case 1:
            deQueue(p);
            break;
        }
    }
    clear(p);
    return 0;
 
}
 

  • 这篇博客也许可以解决你的问题👉 :Segmentation Fault 错误原因
  • 除此之外, 这篇博客: 由char* 引发的Segmentation fault错误中的 在本篇文章里通过几个案例来分析由char * 引起的Segmentation fault。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 我们先来看一个关于使用char* 的案例

    #include <stdio.h>
    void print (char *p1);
    
    int main () {
    
    	print("2020-xx-xx");
    	return 0;
    }
    
    void print (char *p1) {
    	while ( *p1 != '\0' ){
    		printf("%c",*p1++);
    	}
    	printf("\n");
    }
    

    其运行结果为2020-xx-xx,看起来并没有什么问题。但在上面的基础上做一些修改,就会引发Segmentation fault错误,请看下面的案例

    #include <stdio.h>
    void print (char *p1);
    
    int main () {
    
    	print("2020-xx-xx");
    	return 0;
    }
    
    void print (char *p1) {
    	char *p =p1;
    	while ( *p1++ != '\0' ){
    		if(*p1== 'x') {
    			*p1 = '1';//这一条语句会引发Segmentation fault错误
    		}
    	}
    
    	printf("%s\n",p);
    }
    

    从上面两个案例来说,实参是字符串常量时,通过形参指针进行访问并不会引发错误,而当你试图想要修改这个指针所指向的值,会引发Segmentation fault错误。

    至于为什么会出现Segmentation fault错误,看下面的案例就能清楚了
    #include <stdio.h>
    int main () {
    
    
    	int *p1 =2;
    	int  num=1;
    	int *p2= &num;
    
    	printf("*p1=%d\n",*p1);
    	printf("*p2=%d\n",*p2);
    	return 0;
    }
    

    当你编译这段程序时,会有警告信息:warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]

    当你运行这段程序时,会有报错信息:Segmentation fault

    当你试图向一个未初始化的指针赋值常量时,这往往会引发错误,因为你并不知道指针会指向哪里,这充满了未知!!总之,在使用指针要尽量小心,避免不必要的错误!!!!!

    在第一个案例中,可以正常打印字符串,这为什么不会报错,有待进一步研究。下面是strcpy库的正确使用方法.

    #include <stdio.h>
    #include <string.h>
    int main () {
    
    	char s1[] = "s1";
    	char s2[] = "s2";
    	char *pointer_1 = s1;
    	char *pointer_2 = s2;
    	//正确用法
    	printf("%s\n",strcpy(s1,s2) );
    	printf("%s\n",strcpy(pointer_1,pointer_2) );
    
    	//这条可以运行,但不推荐使用
    	printf("%s",strcpy(pointer_1,"s2") ); 
    
    	//下面会引发Segmentation fault
    	//printf("%s",strcpy("s1","s2") ); 
    	//printf("%s",strcpy("s1",pointer_2) );
    
    
    	return 0;
    }