首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-04-14 
这个指针为什么为飞呢!!#includestdio.h#includestdlib.h#includestring.h#defineQUEUE_LEN10/*队列

这个指针为什么为飞呢!!
#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; } 

热点排行