这可能看起来是一个非常基本的问题,但一直在我的脑海中:
当我们分配一个局部变量时,它会进入堆栈。同样,动态分配会导致变量进入堆。现在,我的问题是,这个变量实际上是否位于堆栈或堆上,还是我们只是在堆栈和堆中有一个引用。
例如,假设我声明一个变量int i
。现在这个i
被分配在堆栈上。因此,当我打印i
的地址时,这将是堆栈上的一个位置吗?对于使用堆的情况也是同样的问题。
这可能看起来是一个非常基本的问题,但一直在我的脑海中:
当我们分配一个局部变量时,它会进入堆栈。同样,动态分配会导致变量进入堆。现在,我的问题是,这个变量实际上是否位于堆栈或堆上,还是我们只是在堆栈和堆中有一个引用。
例如,假设我声明一个变量int i
。现在这个i
被分配在堆栈上。因此,当我打印i
的地址时,这将是堆栈上的一个位置吗?对于使用堆的情况也是同样的问题。
我不完全确定你在问什么,但我会尽力回答。
以下代码在堆栈中声明了一个变量i
:
int i;
当我使用&i
请求地址时,我得到的是堆栈上实际位置。
当我使用malloc
动态分配内存时,实际上存储了两个数据片段。动态内存在堆上分配,而指针本身在栈上分配。所以在这段代码中:
int* j = malloc(sizeof(int));
这是为一个整数在堆上分配空间。它也为指针(j
)在栈上分配了空间。变量 j
的值设置为由 malloc
返回的地址。
希望以下内容对您有所帮助:
void foo()
{
// an integer stored on the stack
int a_stack_integer;
// a pointer to integer data, the pointer itself is stored on the stack
int *a_stack_pointer;
// make a_stack_pointer "point" to integer data that's allocated on the heap
a_stack_pointer = (int*)malloc(10 * sizeof(int));
}
对于堆栈变量,变量本身(实际数据)存储在堆栈上。
对于在堆上分配的内存,底层数据总是存储在堆中。指向此内存/数据的指针可能存储在堆栈上。
希望这可以帮到你。
int *i = malloc(sizeof(int));
i
会驻留在堆栈上,而*i所指向的实际内存则在堆上。
我同意Chris的看法。这是另一种解释方法。请考虑以下代码:
int* j = malloc(sizeof(int));
free(j);
malloc()
大多数情况下会在堆上分配数据。如果分配的数据大于MMAP_THRESHOLD
,通常在32位系统上为128kb,则malloc()
将不会使用堆,而是在匿名内存段中分配数据,该内存段通常位于堆栈下方,向低内存增长。man malloc
中相关的段落:MMAP_THRESHOLD
不是 ANSI/ISO C 或任何 POSIX 标准的一部分。仍然很有趣,但并不是所有 C 实现的固有真理。不过看起来对于 glibc 和 musl 是正确的。 - Wyatt Ward栈或堆不是独立的内存,它们是系统分配给运行程序的内存段,只是在内存中组织数据的不同方式。
因此,当你得到 &i 时,它就是一个内存地址,就这么简单。