首页 > 解决方案 > 在堆栈与堆中初始化一个指针

问题描述

当我通过调用 malloc 在堆中分配内存时,我的程序可以正常工作(如预期的那样)。但是当我不使用 malloc 时它不起作用。所以我的问题是,为什么在调用堆栈或堆中创建 struct* 时会有所不同?

struct que{
    int data[10];
    int front;
    int rear;
};

int main(){
    //struct que* q;
    struct que* q=(struct que*)malloc(sizeof(struct que));;
    q->front=-1;
    q->rear=-1;
    q->data[1]=10;
    printf("%d %d",q->rear,q->data[1]);
}

标签: c

解决方案


定义

struct que* q;

定义q为一个指针,但你永远不会让它指向任何地方。它的值将是不确定的,取消引用指针将导致未定义的行为

你可能打算做例如

struct que q;

这将结构对象本身放在“堆栈”上。


顺便说一句,即使有这样的定义

struct que* q = malloc(sizeof(struct que));

指针变量q本身将在“堆栈”上,但它指向的内存将在堆上。

[注意:不要投射malloc]

此外,C 规范也没有提到局部变量(包括参数)使用“堆栈”,而只是自动存储。将局部变量存储在堆栈上的选择是由编译器做出的,并且由于 CPU 的体系结构而恰好是最常见的。


推荐阅读