读书人

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

发布时间: 2012-04-14 17:14:21 作者: rapoo

这个指针为什么为飞呢!!
#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]代表代码的结束。
[解决办法]
关键的问题是你把队列放在了一个函数的局部变量里,只要一离开那个函数你的队列就不安全了:

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; } 

读书人网 >C语言

热点推荐