重新整理一下:申请空间返回的可以认为是一个地址;不是“不可以把常量写进指针”,而是说解引用指针的时候( *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;
}
|