这个指针为什么为飞呢!解决办法
这个指针为什么为飞呢!!
#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所指向的结构体内的元素值就会变,还请高手们多多指教,谢谢!
------解决方案--------------------
#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所指向的结构体内的元素值就会变,还请高手们多多指教,谢谢!
------解决方案--------------------