这个指针为什么为飞呢!解决办法

这个指针为什么为飞呢!!
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>

#define QUEUE_LEN   10 /*   队列有元素个数   */

typedef   struct   queue{                         /*   定义一个描述队列的结构   */
int queue_len;
int   *queue_addr; /*   队列首地址   */
int   *rear;
int   *front;
}Queue;

Queue   *creat_queue(void)                 /*   新建一个队列   */
{
Queue   queue   =   {0,   NULL,   NULL,   NULL};
Queue   *p_queue   =   &queue;                 /*   指向描述队列结构体的指针   */

p_queue-> queue_addr   =   p_queue-> rear   =   (int   *)malloc(sizeof(int)   *   QUEUE_LEN);       /*   下面几句初始化   */
memset(p_queue-> queue_addr,   0,   QUEUE_LEN);
p_queue-> queue_len   =   QUEUE_LEN;
p_queue-> front   =   --p_queue-> rear;

return   p_queue;       /*   返回指针   */
}

Queue   *insert(Queue   *p_queue,   int   value)       /*   向队列尾插入元素函数   */
{
int   i;
i   =   is_full(p_queue);
if(i)
*(++p_queue-> rear)   =   value;
else
printf( "can 't   insert   this   vlaue,   this   queue   is   full.\n ");
return   p_queue;
}

Queue   *fetch(Queue   *p_queue,   int   *value)                 /*   取队首元素函数,value为取到的值   */
{
int   i   =   0;
i   =   is_empty(p_queue);
if(i)
*value   =   *(++(p_queue-> front));
else
printf( "can 't   fetch   this   queue,   this   queue   was   empty.\n ");
return   p_queue;
}

int   is_full(Queue   *p_queue)             /*   判断队列是否为满   */
{
return   (p_queue-> rear   ==   (p_queue-> queue_addr   +   QUEUE_LEN   -   1))?   0   :   1;
}

int   is_empty(Queue   *p_queue)         /*   判断队列是否为空   */
{
return   p_queue-> front   ==   p_queue-> rear   ?   0   :   1;  
}

int   main(void)
{
int   value   =   0;
int   *p_value   =   &value;
int   i   =   0;
Queue   *p_queue   =   NULL;

p_queue   =   creat_queue();

for(i   =   0;   i   <   QUEUE_LEN;   i++)             /*   向队列中插元素   */
p_queue   =   insert(p_queue,   i   +   1);

for(i   =   0;   i   <   QUEUE_LEN;   i++)      
{
p_queue   =   fetch(p_queue,   p_value);                 /*   取元素   */
printf( "fetched   value   is:   %d.\n ",*p_value);   /*   打印,每次到这里描述队列的那个结构里面的指针就变了--搞不明白   */
}

return   0;
}

搞不明白的是为什么每次到打印的时候p_queue所指向的结构体内的元素值就会变,还请高手们多多指教,谢谢!

------解决方案--------------------