读书人

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

发布时间: 2013-09-08 15:21:21 作者: rapoo

这个输出怪异现象是什么道理
下面是一个程序,建立一个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楼的观点,这样更改后,应该也是越界了,但是实际上没有。

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

读书人网 >C语言

热点推荐