本帖最后由 squall001 于 2020-8-27 01:01 编辑
大概意思是我做了个队列,在VS上面跑没问题,在单片机上面跑就出问题了,最终我把问题定位在了一条给指针赋值的语句上,结果就是赋值失败,但是诡异的是失败是有概率的,并不是每次赋值都失败,只是有时候失败。。。
~~~下面直接上代码
下面是头文件内的代码,声明结构体
- typedef unsigned char QElemType;
- typedef struct QNode //节点结构
- {
- QElemType data;
- struct QNode *prev;//指向上一个节点
- }QNode,*QueuePtr;
- typedef struct Link_queue//队列的链表结构
- {
- QueuePtr front;
- QueuePtr rear; //队列的头、尾指针
- }LinkQueue;
下面是C文件相关代码段
- /*
- *********************************************************************************************************
- * 功能说明: 从队列里面获取最先进队的数据,并删除该节点
- * 形 参: data 把数据存放在该指针地址
- * 返 回 值: Q_Status Q_ERR_NO 返回错误,队列没有数据 Q_ERR_OK成功执行
- **********************************************************************************************************/
- Q_Status GetQueue(LinkQueue* Q,QElemType* data)
- {
- QueuePtr p=NULL;
- p=Q->rear; //这里赋值 有时候会失败,而且是确定Q->rear为非空的情况下
- if (Q->rear == NULL && Q->front == NULL)
- {
- return Q_ERR_NO;
- }
- if (Q->rear->prev != NULL) //表示当前队列节点数 > 1
- {
- ////以下if语句仅做调试用
- if(p==NULL)
- {
- p=Q->rear; //强行再次赋值
- return Q_ERR_NO;
- }
- ///////////////////////////
- *data = Q->rear->data; //把值赋给传进来的参数
- Q->rear = Q->rear->prev; //把队列指针的尾节,点前移一个节点
- free(p); //释放内存
- return Q_ERR_OK;
- }
- else if (Q->rear != NULL) //这里表示队列只有一个节点
- {
- ////以下if语句仅做调试用
- if(p==NULL)
- {
- p=Q->rear;
- return Q_ERR_NO;
- }
- ///////////////////////////
- *data = p->data; //把值赋给传进来的参数
- Q->front = Q->front->prev;
- Q->rear = Q->rear->prev;
- free(p);
- return Q_ERR_OK;
- }
- else
- {
- //这里表示队列没有节点了 暂时不做任何操作
- return Q_ERR_NO;
- }
- }
问题:
问题就出在这函数内的第二句p=Q->rear;这个Q是结构体指针,申请的全局变量,p就是函数内申请的临时指针变量,类型同样也是定义的那种结构体指针。根据队列里面是否为空,那么这个指针有时候有值,有时候为NULL,这个正常。
其他都不用讨论了,要说的情况就是在我确定Q->rear不为NULL的情况下,执行语句p=Q->rear;结果p还是为null,下面直接上图
下图是相应的汇编代码
这种赋值失败我确实不知道怎么解决了,我用的MDK为keil 5.27,HAL库
|