|
发表于 2022-8-2 11:55:23
|
显示全部楼层
重新整理一下:申请空间返回的可以认为是一个地址;不是“不可以把常量写进指针”,而是说解引用指针的时候( *p, p[0] 等等)是在把指针的值当作一个内存地址,访问(读或写)这个地址指向的内存,除非您清楚的知道某个固定内存地址的含义并确定应当访问之——个人认为在当前的阶段您应该不会遇到这种情况,您应该总是通过动态内存分配或者取地址操作来获得指针的值,确保访问的地址总是被良好管理的,而不是手动写入导致可能访问一些计划之外的内存位置。一个显然的例外就是使用 NULL 或等效写法:您清楚这一值的含义,并且这一地址不应被解引用,因此可以向指针写入这一值。对于“栈的大小已经固定了”,我不是特别清楚您的意思,猜测您是说 new 之后栈的大小就被限定了?在不重新进行内存分配的前提下可以这样说,由于只分配了 MAXSIZE 大小的空间,栈的可用空间已经被限制了,您不应该向栈中存储超过 MAXSIZE 个元素。
对于您说的报错,我不明白发生了什么,如果还需要更多帮助的话可以考虑提供一下代码和报错信息。您也可以参考一下我在您的基础上稍加修改的代码( C ):
- #include<stdlib.h>
- #include<stdio.h>
- #include<stdbool.h>
- #define OK 1
- #define ERROR 0
- #define MAXSIZE 100
- //定义顺序栈
- typedef struct {
- int* base; //栈底指针
- int* top; //栈顶指针
- int stacksize; //栈可用的最大容量
- }Sqstack;
- //初始化函数
- int Init(Sqstack* S) {
- S->base=(int*)malloc(MAXSIZE * sizeof(int));
- if (S->base == NULL) exit(0);
- S->top = S->base;//这里赋初值入栈中e的写入就要报错,不赋初值感觉又不好
- S->stacksize = MAXSIZE;
- return OK;
- }
- int Destory(Sqstack* S) {
- free(S->base);
- S->top = S->base = NULL;
- S->stacksize = 0;
- return OK;
- }
- //判断栈是否为空
- bool stackEmpty(Sqstack* S) {
- if (S->top == S->base)
- return true;
- else
- return false;
- }
- //入栈
- int Push(Sqstack* S, int e) {
- if (S->top - S->base == S->stacksize) return ERROR; //栈满
- *(S->top) = e;
- (S->top)++;
- return OK;
- }
- //出栈
- int Pop(Sqstack* S, int* e) {
- if(stackEmpty(S)) return ERROR;
- --(S->top);
- *e = *(S->top);
- printf("%d\n", *e);
- return OK;
- }
- int main()
- {
- Sqstack S;
- Init(&S);
- //stackEmpty(S);
- int e, op;
- while(true){
- scanf("%d", &op);
- if(op == 0){
- scanf("%d", &e);
- Push(&S,e);
- }else if(op == 1) Pop(&S,&e);
- else break;
- }
- Destory(&S);
- return 0;
- }
复制代码 |
|