使用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 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )