gpt4 book ai didi

c - C 中的堆栈指针与堆指针

转载 作者:行者123 更新时间:2023-12-02 07:22:32 24 4
gpt4 key购买 nike

我目前正在学习 C,我对内存布局和指针感到困惑。

在下面的代码中,我的理解是数组分配在栈上。

#include <stdio.h>

int main () {
int x[4];
x[0] = 3; x[1] = 2; x[2] = 1;
printf("%p\n",x);
printf("%p\n", &x);
}

我的问题是,为什么两个打印调用输出相同的值?

我使用 malloc(在堆上分配)尝试了类似的片段,但值不同。

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

int main () {
int *x = malloc(sizeof(int) * 4);
x[0] = 3; x[1] = 2; x[2] = 1;
printf("%p\n",x);
printf("%p\n", &x);
}

最佳答案

原因是,与您可能被教导的不同,数组不是指针。在某些情况下,C 中的数组退化为指针1。当您将数组传递给函数时,它会衰减为指向第一个元素的指针。该元素的地址与整个数组的地址相同(地址始终指向对象的第一个字节)。

你从malloc得到的不是一个数组,而是一 block 内存的地址。您将地址分配给指针。但是指针和 block 是独立的实体。因此打印指针的值,而不是它的地址,会产生不同的结果。


(1) Decay 是一种隐式类型转换的花哨术语。当在大多数 地方使用数组表达式时(例如作为参数传递给需要指针的函数),它会自动变成指向其第一个元素的指针。 “衰减”是因为您丢失了类型信息,即数组大小。

关于c - C 中的堆栈指针与堆指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41861549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com