使用malloc函数出现段错误-一级指针-二级指针

Posted dengqiangjiayou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用malloc函数出现段错误-一级指针-二级指针相关的知识,希望对你有一定的参考价值。

使用malloc函数出现段错误

typedef struct
{
    int top;
    int tail;
    int* stk;
}Queue;

typedef struct {
    Queue* In;
    Queue* Out;
} MyStack;

void EnterQueue(Queue* obj,int x)
{
    obj->stk[obj->top];
    obj->tail++;
}
int ExitQueue(Queue* obj)
{
    int resual = obj->stk[obj->top];
    obj->top++;
    return resual;
}
/** Initialize your data structure here. */

MyStack* myStackCreate() {
    MyStack* myStack = (MyStack*)malloc(sizeof(MyStack));
    //printf("%d\\n",sizeof(Queue));
    myStack->In = (Queue*)malloc(sizeof(Queue));
    myStack->In->stk = (int*)malloc(sizeof(int) * 20);
    myStack->In->top = 0;
    myStack->In->tail = 0;
    myStack->Out = (Queue*)malloc(sizeof(Queue));
    myStack->Out->stk = (int*)malloc(sizeof(int) * 20);
    myStack->Out->top = 0;
    myStack->Out->tail = 0;
    return myStack;
}

int main()
{
    
    MyStack* create = myStackCreate();
    myStackPush(create,666);

    printf("%d\\n",ExitQueue(create->Out));


}

以上的代码没有出现错误,而下面的却出现错误

typedef struct
{
    int top;
    int tail;
    int* stk;
}Queue;

typedef struct {
    Queue* In;
    Queue* Out;
} MyStack;

void EnterQueue(Queue* obj,int x)
{
    obj->stk[obj->top];
    obj->tail++;
}
int ExitQueue(Queue* obj)
{
    int resual = obj->stk[obj->top];
    obj->top++;
    return resual;
}
/** Initialize your data structure here. */

MyStack* myStackCreate() {
    MyStack* myStack ;
    /*//这里没有申请一段堆空间用来使指针指向的数据有效。这里申请得到一个栈空间,这个栈空间用来存放 MyStack* 大小的数据也就是4字节,
    //printf("%d\\n",sizeof(Queue));
    所以你如果打印一下值会出错:
    printf("myStack->Out:%d\\n",myStack->Out);
    printf("myStack->Out addr is :%d\\n",&myStack->Out); //因为系统中根本就没有给这些成员分配空间,所以你如果在打印&myStack->Out地址之前就分配好空间打印就不会出错
    MyStack* myStack= (MyStack*)malloc(sizeof(MyStack));
    printf("myStack addr is :%d\\n",&myStack->Out);
    printf("myStack 、 is :%d\\n",myStack->Out); //它的值是随机值,只要不是静态区的数据都是随机值
    */
    myStack->In = (Queue*)malloc(sizeof(Queue));
    myStack->In->stk = (int*)malloc(sizeof(int) * 20);
    myStack->In->top = 0;
    myStack->In->tail = 0;
    myStack->Out = (Queue*)malloc(sizeof(Queue));
    myStack->Out->stk = (int*)malloc(sizeof(int) * 20);
    myStack->Out->top = 0;
    myStack->Out->tail = 0;
    return myStack; 
}

int main()
{
    
    MyStack* create = myStackCreate();
    myStackPush(create,666);

    printf("%d\\n",ExitQueue(create->Out));


}

这里再说一句,如果你这样 MyStack* myStack = NULL ;结果也同样会出错,因为在C语言中NULL表示空指针也就是 ( (void*)0 )。一般初始化指针的时候会用到。

所以看完以上,你是否明白为啥会出现段错误了没? 下面的链接说的也是类似的问题

C语言在子函数中调用malloc申请内存的方法
C语言在子函数中调用malloc申请内存出现段错误
malloc申请内存问题

最后说一下指针相关:指针也是变量,也有传值运算和传址运算,上面的链接有相关的问题分析,加深对指针的理解

以上是关于使用malloc函数出现段错误-一级指针-二级指针的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

c语言的二级指针如何初始化了?

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?

delphi中的二级指针怎么定义

关于二级指针与一级指针相互转换的问题!

STL-空间配置器迭代器traits编程技巧