鱼C论坛

 找回密码
 立即注册
查看: 2009|回复: 6

大佬求帮助,S.base那里好像不能赋初值

[复制链接]
发表于 2022-7-31 22:36:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 tyl555 于 2022-8-2 09:06 编辑

/**
*author :LaoGu
*time   :2021/10/12
*purpose:栈的数制转换

**/
#include<iostream>

using namespace std;

#define OK 1
#define ERROR 0
#define MAXSIZE 100

//定义顺序栈
typedef struct {
    int* base;    //栈底指针
    int* top;     //栈顶指针
    int stacksize;  //栈可用的最大容量
}Sqstack;
int e;
//初始化函数
int Init(Sqstack& S) {
    S.base = new int[MAXSIZE];
    if (!S.base) exit(0);
    S.top = S.base=0;//这里赋初值入栈中e的写入就要报错,不赋初值感觉又不好
    S.stacksize = MAXSIZE;
    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 (S.top == S.base) return ERROR;
    --S.top;
    e = *S.top;
    printf("%d", e);
    return 0;
}
int main()
{
    Sqstack S;
    Init(S);
    stackEmpty(S);
    scanf_s("%d", &e);
    Push(S,e);
    Pop(S,e);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 10:55:02 | 显示全部楼层
不赋初值不太好是对的,但是乱赋初值至少同样不好。
请重新阅读一下您加注释的那句“赋初值”的语句和所在的函数,思考一下这个“初值”的意义是什么?为什么申请了空间并把地址存储到 base 里之后转手就把 base 和 top 全都写成 0 ?之后的入栈从 0 地址开始往高地址写?麻烦先把逻辑想清楚。
另外,申请了内存要正确释放,以及一个个人的小看法,既然已经用了 C++ 可能就可以考虑用一些类的语法,代码写起来也许会观感更好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-2 08:28:44 | 显示全部楼层
dolly_yos2 发表于 2022-8-1 10:55
不赋初值不太好是对的,但是乱赋初值至少同样不好。
请重新阅读一下您加注释的那句“赋初值”的语句和所在 ...

好的,谢谢大佬建议。
还是不明白。
初学,我认为栈是初始化时栈底指针和栈顶指针指向同一个位置(难道是因为我用的结构体变量),入栈时栈顶指针加加,要么指向当前存储位置的下一个位置,要么指向当前存储位置。
所以,base和top赋值0,我感觉就只是给它一个准确的位置吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-2 08:52:55 | 显示全部楼层
栈的维护逻辑应该是没有问题的,但是您似乎没有理解
S.base = new int[MAXSIZE];
您可能需要再去学习一下 C++ 的基础动态内存管理方式。
简单的说,这里使用 new 操作符申请分配了连续的、恰可容纳 MAXSIZE 个 int 类型的空间,其结果为这段空间的起始地址,被存储进了 base 中。从效果上, base 现在指向了一个长度为 MAXSIZE 的可用 int 数组,这也就是这个栈要使用的存储位置。
除非您非常清楚其含义和效果,并且是明确设计的,否则通常不应该将一个常量地址写入指针中进行使用(解引用)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-2 09:17:19 | 显示全部楼层
本帖最后由 tyl555 于 2022-8-2 09:21 编辑
dolly_yos2 发表于 2022-8-2 08:52
栈的维护逻辑应该是没有问题的,但是您似乎没有理解

您可能需要再去学习一下 C++ 的基础动态内存管理方 ...


好的
我用c语言的,改成s.base=(int*)malloc(MAXSIZE * sizeof(int));还是报错,也就是说申请空间返回的是一个地址,栈的大小已经固定了,不能把常量写入地址中。就不能在s.base中赋予初值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-2 11:55:23 | 显示全部楼层
tyl555 发表于 2022-8-2 09:17
好的
我用c语言的,改成s.base=(int*)malloc(MAXSIZE * sizeof(int));还是报错,也就是说申请空间返 ...

重新整理一下:申请空间返回的可以认为是一个地址;不是“不可以把常量写进指针”,而是说解引用指针的时候( *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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-2 12:35:54 | 显示全部楼层
dolly_yos2 发表于 2022-8-2 11:55
重新整理一下:申请空间返回的可以认为是一个地址;不是“不可以把常量写进指针”,而是说解引用指针的时 ...

行吧,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表