请问为什么循环队列这段代码会爆出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;
}
我们先来看一个关于使用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");
}
#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);
}
#include <stdio.h>
int main () {
int *p1 =2;
int num=1;
int *p2= #
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;
}