这个指针为什么为飞呢!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#defineQUEUE_LEN 10/* 队列有元素个数 */
typedef struct queue{ /* 定义一个描述队列的结构 */
intqueue_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所指向的结构体内的元素值就会变,还请高手们多多指教,谢谢!
------解决方案--------------------
因为你创建的时候是有问题的。看下我写的这个帖子吧。
http://topic.csdn.net/u/20120319/15/0751ad00-bad3-481b-9f3a-fed7409cb9cc.html
[解决办法]
[Quote=引用:]
请问5楼:如何用代码标签?
我打过断点调过了,就是在那个[code=C/C++][/code]printf( "fetched value is: %d.\n ",*p_value);
调用打印后p_queue指向的结构内的值就变了,但是不知道为什么会变掉!!
还有2楼贴大我也看了,还是没有发现这个程有什么错误!!期待中解答,我也自己再调调!先谢谢你们!
[/Quote]
[code=C/C++] 里面写代码[ / code]
[code=C/C++] 代表代码的开始,[ / code]代表代码的结束。
[解决办法]
关键的问题是你把队列放在了一个函数的局部变量里,只要一离开那个函数你的队列就不安全了:
#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; int i; Queue *p_queue = (Queue *)malloc(sizeof(Queue));// 为队列分配一块地方,以免被其它函数的自变量纂改。 p_queue->queue_addr = p_queue->rear = (int *)malloc(sizeof(int)*QUEUE_LEN); //memset(p_queue->queue_addr, 0, QUEUE_LEN); // 这里你仅仅将10个char置为0,而不是10个int for (i=0;i<QUEUE_LEN;i++) // 代替你的memset初始化那10个值。 p_queue->queue_addr[i]=0; 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; }