本帖最后由 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库
|