其中数组保存在内存C中

其中数组保存在内存C中,c,arrays,stack,C,Arrays,Stack,我有一个小问题-当我这样定义数组时: int arr[10]; 我会这样做: func(arr); 我知道arr是通过引用而不是通过值发送的,但是,它是否表示数组在堆中?不,当然不是。 那么它在堆栈中是如何工作的呢? 谢谢你 它位于堆栈或bss(未初始化数据部分)中。在任何情况下,传递给func的都是指向数组第一个元素地址的指针,通过该指针可以对所有其他元素进行索引。把指针想象成映射到RAM内存中特定位置的整数,比如字节粒度的GPS坐标或类似的东西。该地址可以位于内存中的任何位置,而不仅仅是

我有一个小问题-当我这样定义数组时:

int arr[10];
我会这样做:

func(arr);
我知道arr是通过引用而不是通过值发送的,但是,它是否表示数组在堆中?不,当然不是。 那么它在堆栈中是如何工作的呢?
谢谢你

它位于堆栈或bss(未初始化数据部分)中。在任何情况下,传递给func的都是指向数组第一个元素地址的指针,通过该指针可以对所有其他元素进行索引。把指针想象成映射到RAM内存中特定位置的整数,比如字节粒度的GPS坐标或类似的东西。该地址可以位于内存中的任何位置,而不仅仅是堆。仅我的2个客户端

它位于堆栈或bss(未初始化数据部分)中。在任何情况下,传递给func的都是指向数组第一个元素地址的指针,通过该指针可以对所有其他元素进行索引。把指针想象成映射到RAM内存中特定位置的整数,比如字节粒度的GPS坐标或类似的东西。该地址可以位于内存中的任何位置,而不仅仅是堆。仅my 2cents

对于数组,内存将在编译时分配,内存空间将在堆栈中分配。
如果使用指针,则应动态分配内存,并在堆内存中分配内存空间。

对于数组,内存将在编译时分配,内存空间将在堆栈中分配。
如果使用指针,则应动态分配内存,并在堆内存中分配内存空间。

编译和运行代码:

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

int main()
{
    int arr[10];
    printf("arr = %p\n",arr);   
    sleep(50);  
    exit(0);
}
#包括
#包括
int main()
{
int-arr[10];
printf(“arr=%p\n”,arr);
睡眠(50);
出口(0);
}
然后是pmap PID_of_,_过程为我提供:

00007f68a084b000 8K rw---[anon]

00007fff4a991000 84K rw---[堆栈]

00007fff4a9ff000 4K r-x--[anon]

ffffffffff600000 4K r-x--[anon]

由于代码正在打印: arr=0x7fff4a9a4480

这表明arr是在这里的堆栈上分配的


希望这有帮助。

编译和运行代码:

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

int main()
{
    int arr[10];
    printf("arr = %p\n",arr);   
    sleep(50);  
    exit(0);
}
#包括
#包括
int main()
{
int-arr[10];
printf(“arr=%p\n”,arr);
睡眠(50);
出口(0);
}
然后是pmap PID_of_,_过程为我提供:

00007f68a084b000 8K rw---[anon]

00007fff4a991000 84K rw---[堆栈]

00007fff4a9ff000 4K r-x--[anon]

ffffffffff600000 4K r-x--[anon]

由于代码正在打印: arr=0x7fff4a9a4480

这表明arr是在这里的堆栈上分配的


希望这能有所帮助。

这取决于您是在函数中还是在全局级别声明它。如果它是全局级别的,那么它不在堆栈(或堆)上,而是在数据段中。它不是“通过引用发送”。它衰减为指针(
func
接收指向
arr
的指针)。它是指向堆栈上数组的指针,与堆无关。这个问题与我几天前回答的问题非常相似:向函数传递数组与数组的存储区域无关。数组存储在它存储的地方,任何存储区域中的数组都可以传递给函数。@RedAlert确实如此。函数接收可用于引用原始对象的标记。这取决于您是在函数中还是在全局级别声明它。如果它是全局级别的,那么它不在堆栈(或堆)上,而是在数据段中。它不是“通过引用发送”。它衰减为指针(
func
接收指向
arr
的指针)。它是指向堆栈上数组的指针,与堆无关。这个问题与我几天前回答的问题非常相似:向函数传递数组与数组的存储区域无关。数组存储在它存储的地方,任何存储区域中的数组都可以传递给函数。@RedAlert确实如此。函数接收一个令牌,该令牌可用于引用原始对象。因此,您实际上是说,在我使用动态分配之前,指针不在堆中?是的,您可以从任何变量获取指针。请参见:
intfoo[4];/*堆栈中*/int*foo_ptr=foo
int*foo_ptr=malloc(4*sizeof(int));/*在heap*/
中,您可以以相同的方式使用它
foo_ptr[1]=0intfoo[4];/*堆栈中*/int*foo_ptr=foo
int*foo_ptr=malloc(4*sizeof(int));/*在heap*/
中,您可以以相同的方式使用它
foo_ptr[1]=0