c - 在堆栈与堆中初始化一个指针
问题描述
当我通过调用 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]);
}
解决方案
定义
struct que* q;
定义q
为一个指针,但你永远不会让它指向任何地方。它的值将是不确定的,取消引用指针将导致未定义的行为。
你可能打算做例如
struct que q;
这将结构对象本身放在“堆栈”上。
顺便说一句,即使有这样的定义
struct que* q = malloc(sizeof(struct que));
指针变量q
本身将在“堆栈”上,但它指向的内存将在堆上。
[注意:不要投射malloc
]
此外,C 规范也没有提到局部变量(包括参数)使用“堆栈”,而只是自动存储。将局部变量存储在堆栈上的选择是由编译器做出的,并且由于 CPU 的体系结构而恰好是最常见的。
推荐阅读
- apache-spark-sql - 列的 Spark 数据框横向
- javascript - 将其分配给变量时的 Firebase 实例差异
- kubernetes - 如何在 Knative 中设置 MaxRevisionTimeoutSeconds?
- bazel - 如何使用 Bazel 为使用 cmake 构建的包创建轮文件
- asp.net-core - ASP.NET Core WebAPI 3.1 多参数 vs 复杂对象 httpget
- python - 在pygame中创建多个相同的图像
- firebase - 自定义通知声音 FireBase
- azure - 无法使用 ARM 模板创建 Azure RBAC 自定义角色
- reactjs - 使用钩子和 redux 材料 ui 将值设置为文本字段
- excel - Vba宏来验证一个表是否包含另一个表的数据并复制行