分配内存指针为空情况


typedef struct Sq
{
    SelemType* base;
    SelemType* top;                    //栈顶指针指向栈顶元素的下一个位置
    int stacksize;                            //表示当前栈可使用的最大容量
}Sqstack;                                        //顺序栈结构定义
int CreatStack(Sqstack*S);
int main()
{
    Sqstack* stack=0;
    CreatStack(stack);
}
int CreatStack(Sqstack* S)    //构造一个空栈S
{
    **S->base = (SelemType*)malloc(STACK_INIT_SIZE * sizeof(SelemType));_**这里会报错,说S是nullptr,将形参位置改为Sqstack* S= (Sqstack*)malloc(sizeof(struct Sq))后错误任未变

    if (!  S->base)
        exit(1);                                    //exit(x)x不为0都表示异常退出,头文件stdio.h
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return 0;
}****

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
下面是代码问题的解释和修改建议:

  1. 在主函数中,将指向Sqstack结构体的指针stack初始化为0,这意味着stack指针指向空地址,传递给函数CreatStack的形参S也是空指针,无法分配内存空间。如果要使用指针变量,应该分配内存空间后再传递指针。

  2. 在函数CreatStack中,S->base应该是一个指向SelemType类型指针的指针,表示栈底指针。因此,在分配内存时应该使用单级指针,而不是双级指针。

下面是修改后的完整代码:

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100   //栈的初始大小
typedef int SelemType;        //定义栈元素类型

typedef struct Sq {
    SelemType* base;
    SelemType* top;      //栈顶指针指向栈顶元素的下一个位置
    int stacksize;       //表示当前栈可使用的最大容量
} Sqstack;               //顺序栈结构定义

int CreatStack(Sqstack* S); //构造一个空栈S

int main()
{
    Sqstack* stack = (Sqstack*)malloc(sizeof(Sqstack)); //分配内存空间
    CreatStack(stack);
    free(stack);  //释放内存空间
    return 0;
}

int CreatStack(Sqstack* S)  //构造一个空栈S
{
    S->base = (SelemType*)malloc(STACK_INIT_SIZE * sizeof(SelemType));
    if (!S->base) {
        exit(1); //分配内存失败
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return 0;
}

在主函数中,我们先分配Sqstack结构体的内存空间,然后将指针传递给函数CreatStack。在函数CreatStack中,我们使用单级指针分配内存空间,并将指针赋值给S->base。最后,在主函数结束时,我们释放Sqstack结构体的内存空间。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

Sqstack* stack=0; 这句要先给stack分配内存。

(*S)->base = ...一个星号就够了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/853943
  • 这篇博客你也可以参考下:堆栈与动态分配内存空间
  • 除此之外, 这篇博客: 电子工程师必须掌握的硬件测试仪器,你确定你都掌握了?中的 屏幕刻度认识 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 您还可以看一下 熊健老师的嵌入式应该怎么去学?课程中的 嵌入式的现状小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    出现指针返回为空的情况可能是因为分配的内存空间不足,或者指针指向的位置出现了问题,比如指针被错误地释放或者指针被错误地修改了。解决方法可以分为以下几步:

    1.检查内存分配是否正确:使用malloc或者calloc等分配内存空间的函数时要注意传入的参数是否正确,包括要分配的空间大小以及变量类型等。

    2.检查指针指向的位置是否出现问题:可以通过打印指针指向的地址来查看指针指向的位置是否正确。如果指针已经被释放掉了,就需要重新使用malloc等函数来分配内存空间,然后再次使用指针。

    3.检查指针是否被错误地修改了:可以检查代码中对指针的操作,比如指针的加减运算是否正确。可以使用指针的算术运算来对数组进行操作,但是要注意计算出的地址是否在数组的合法范围内。

    下面是一个例子,展示了如何使用指针的算术运算来进行数组的遍历和修改:

    int array[10]; int *ptr = array;

    for(int i=0;i<10;i++){ (*ptr) = i; //修改值 ptr++; //指针加1 }

    //指针回到数组开头 ptr = array;

    for(int i=0;i<10;i++){ printf("%d ",*ptr); //遍历数组并输出 ptr++; }

    输出结果为:0 1 2 3 4 5 6 7 8 9。

    注意,指针的加减运算是根据变量类型来决定步长的,比如整型变量占用4个字节,指向整型变量的指针加1时,地址会增加4个字节。