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

这个输出奇异现象是什么道理

2013-09-08 
这个输出怪异现象是什么道理下面是一个程序,建立一个6大小的栈,然后往栈内压入6个数,然后输出后三个数。我

这个输出怪异现象是什么道理
下面是一个程序,建立一个6大小的栈,然后往栈内压入6个数,然后输出后三个数。我在main里面最开始加了
printf("123\n");这是为了证明我的编译器可以运行。为什么我加了这一句得到想要的结果

123
6 5 4
Press any key to continue

而没有这一句(把printf("123\n")注释掉)反而什么输出也没有
Press any key to continue

这是什么原因?

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
 
typedef int Item;
 
typedef struct stack
{
    Item *top;
    Item *save;
 
void CreateStac
}Stack;k(Stack *p, int size);
void PushStack(Item item, Stack *p);
void ReverseShowStack(Stack *p, int size);
 
int main(void)
{
   printf("123\n");
Stack A;
    CreateStack(&A, 6);

PushStack(1, &A);
PushStack(2, &A);
PushStack(3, &A);
PushStack(4, &A);
PushStack(5, &A);
PushStack(6, &A);

ReverseShowStack(&A,3);
printf("\n");
    return 0;
}
 
void CreateStack(Stack *p, int size)     
{      
p->save  = (Item *)malloc(sizeof(Item));  
p->top = p->save+size;
}
 
void PushStack(Item item, Stack *p)
{  
    *(p->top) = item;

p->top--; 
}

void ReverseShowStack(Stack *p, int size)
{  
Item *copy;
    copy = p->top+1;
while(copy != p->top+1+size)
{
printf("%d ", *(copy));
copy++;
}
}

[解决办法]
你的程序有问题,肯定是栈被破坏了,加上printf("123\n");可行了,这句话只是让你的程序的栈增加了,这部分栈被破坏也没有关系,程序可以继续运行,其实我估计你在printf(123)这个地方加上一个局部变量:比如 int a;这样也可以增加一个局部变量,就是栈增加了些,也有一定的保护作用,让你的程序好像看上去没有问题,你需要把你的程序bug找出来,这样就可以了。
[解决办法]
void CreateStack(Stack *p, int size)     


{      
    p->save  = (Item *)malloc(sizeof(Item));  
    p->top = p->save+size;//p->top已经越界了吧
}
  
void PushStack(Item item, Stack *p)
{  
    *(p->top) = item;//第一次push就使用了这个越界的p->top
 
    p->top--; 
}
[解决办法]
void CreateStack(Stack *p, int size)     
{      
    p->save  = (Item *)malloc(sizeof(Item)*size);//貌似还少个size
    p->top = p->save+size;
}
[解决办法]
p->save  = (Item *)malloc(sizeof(Item)); 

-------------------------
内存申请少了,p->save  = (Item *)malloc(sizeof(Item)*size); 
[解决办法]

引用:
不是更加越界,我说法有误,按9楼的观点,这样更改后,应该也是越界了,但是实际上没有。

不是你能正确输出,就证明你的程序没问题。你没申请的内存那也是内存,没别人用你用了也没事,有人用了你的程序就挂了。

热点排行