c - 想弄清楚为什么结构元素发生了变化,而我什么都没做
问题描述
它是一个 SqQueue,当我尝试获取队列中的元素时,我发现队列结构成员发生了变化,但我不知道为什么。当我第一次使用函数 myCircularQueueRear 时,obj 指向的结构元素发生了变化。在函数中,我没有改变那些数据。(leetcode 266)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXQSIZE 100
typedef int Status;
typedef int QElemType;
typedef struct{
QElemType *base;
int front;
int rear;
int size;
int tag;
}MyCircularQueue,*SqQueue;
/** Initialize your data structure here. Set the size of the queue to be k. */
SqQueue myCircularQueueCreate(int k) {
MyCircularQueue Queue;
SqQueue Q=&Queue;
Q->size=k;
Q->tag=0;
Q->base=(QElemType *)malloc(k*sizeof(QElemType));
if(!Q->base)exit(OVERFLOW);
Q->front=Q->rear=0;
return Q;
}
/** Insert an element into the circular queue. Return true if the operation is successful. */
bool myCircularQueueEnQueue(SqQueue obj, int value) {
if(obj->tag==1)return false;
obj->base[obj->rear]=value;
obj->rear=(obj->rear+1)%obj->size;
if(obj->front==obj->rear)obj->tag=1;
return true;
}
/** Delete an element from the circular queue. Return true if the operation is successful. */
bool myCircularQueueDeQueue(SqQueue obj) {
if(obj->front==obj->rear&&obj->tag==0)return false;
obj->front=(obj->front+1)%obj->size;
if(obj->tag==1)obj->tag=0;
return true;
}
/** Get the front item from the queue. */
int myCircularQueueFront(SqQueue Q) {
if(Q->front==Q->rear&&Q->tag==0)return ERROR;
return Q->base[Q->front];
}
/** Get the last item from the queue. */
int myCircularQueueRear(SqQueue Q) {
if(Q->front==Q->rear&&Q->tag==0)return ERROR;
return Q->base[(Q->rear+Q->size-1)%Q->size];
}
/** Checks whether the circular queue is empty or not. */
bool myCircularQueueIsEmpty(SqQueue Q) {
if(Q->front==Q->rear&&Q->tag==0)return true;
else return false;
}
/** Checks whether the circular queue is full or not. */
bool myCircularQueueIsFull(SqQueue Q) {
if(Q->tag==1)return true;
else return false;
}
void myCircularQueueFree(MyCircularQueue* Q) {
free(Q->base);
}
int main(){
SqQueue obj = myCircularQueueCreate(3);
myCircularQueueEnQueue(obj, 1);
myCircularQueueEnQueue(obj, 2);
myCircularQueueEnQueue(obj, 3);
myCircularQueueEnQueue(obj, 4);
当我运行以下行时,struct elemtents obj 指向已更改。
printf("%d ",myCircularQueueRear(obj));
printf("%d ",myCircularQueueIsFull(obj));
myCircularQueueDeQueue(obj);
myCircularQueueEnQueue(obj, 4);
printf("%d ",myCircularQueueRear(obj));
/*int param_3 = myCircularQueueFront(obj);
int param_4 = myCircularQueueRear(obj);
bool param_5 = myCircularQueueIsEmpty(obj);
bool param_6 = myCircularQueueIsFull(obj);
myCircularQueueFree(obj);*/
return 0;
}
IDE 推荐 stackoverflow
解决方案
你在这里有一个UB:
SqQueue myCircularQueueCreate(int k) {
MyCircularQueue Queue; // stack allocation
SqQueue Q=&Queue;
Q->size=k;
/* ... */
return Q; // returning the address of a stack object
}
完成该功能后,分配的结构将被释放
推荐阅读
- php - 将变量分配给 ssh2_sftp($connection) 时出现问题
- javascript - 正则表达式至少包含 1 个特殊字符但不包含特定字符
- python - 从 Ubuntu 终端运行 Python 程序时出现“没有名为 gdbm 的模块”错误
- c++ - 如何在 C++ 程序中读取 .txt 文件
- jsf - 使用 Omnifaces Socket 的应用程序在 Wildfly 上运行良好,但不会在 Weblogic 上部署
- python - 我在 python 的数据框中遇到了 astype 的问题
- r - 是否可以在 R 中执行具有超过 4 个变量的零膨胀泊松回归模型?
- r - 如何让 highcharter 使用整洁数据框中的 colorIndex 编号
- sql - SQL 存储过程,将行与派生变量结合起来
- python - 查找整数列表中的簇数