只有malloc() 、realloc()、 strdup(内部也是用的malloc实现的)这样的函数以后才需要用free()函数去释放指针!! 有新分配才需要去释放。没有就不应该去释放,否则会出错!
顺便说一下:
char *p="name"; 这句的意思将指针指向一个常量字符串数据所在的首地址,任何常量数据的地址都是由系统分配的,是个静态的地址,其内容不能修改! 你可以尝试去改一下,如:*(p+1)='c' ;
是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);
看看是不是你别的程序地方错了,注释掉看看。有可能是别的地方错了影响到编译器的判断
尽量释放吧,那个倒是不用,因为静态变量在栈区。要释放的主要是动态分配的内存,那个会越用越少
1. 是要手动释放指针。
2. 报的是前面那一句的错误, 不能*p="name";