c语言关于栈中内存无法使用的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言关于栈中内存无法使用的问题相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<stdlib.h>
#define append_size 10
typedef struct
int *base;
int *top;
int size;/*可用空间*/
Stack;
void InitStack(Stack *p)

p->top=(int *)malloc(append_size*sizeof(int));/*到这里就出问题了*/
p->base=p->top;
p->size=append_size;

void InsertItem(int item,Stack *p)

if(!p->size)

p->top=(int*)malloc(append_size*sizeof(int));
p->size=append_size;

*(p->top)=item;
p->top++;
p->size--;

void ShowStack(Stack *p)

int *old;
old=p->top;
while(p->top=p->base)

printf("%d\t",*(p->top));
p->top--;

p->top=old;

int main()

int temp,i;
Stack *s;
InitStack(s);
for(i=1;i<=5;i++)

printf("输入第%d个元素",i);
scanf("%d",&temp);
InsertItem(temp,s);

ShowStack(s);
return 0;

到了InitSqlist()就直接死掉了,显示“0x00401055"指令引用的"0xccccccd0"内存。该内存不能为“written"

是InitStack(s)吧?程序里就没有InitSqlist()。
因为栈内容没有初始化,所以访问那个s->top时就出错了,并不是分配内存的malloc的问题。
把主函数里这两行改一下:
Stack *s; /* 这里没有给s分配内存,这只是一个Stack的指针*/
InitStack(s);
改为:
Stack s; /* 这样就给s分配空间了, s.top现在就可以用了*/
InitStack(&s);
这个问题就好了。

相应地,以后使用栈时注意使用指针就好:
ShowStack(s);
改为
ShowStack(&s);

还有一种做法,就是在:
Stack *s;
InitStack(s);
中间给指针s分配内存,让指针s指向正确的结构:
Stack *s;
s = (Stack*)malloc(sizeof(Stack));
InitStack(s);
参考技术A Stack *s;这里的是一个指针,没有分配内存空间

以上是关于c语言关于栈中内存无法使用的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言申请内存?

关于ruby.exe无法正常运行的问题

关于一个C语言写的代码无法运行出结果

无法释放内存

C语言动态内存

c++关于在需要的时候输出当时函数调用栈信息的问题