因为“数组”或数组名称只是一个指向数据块“起点”的指针,所以 sizeof 运算符如何返回数组的大小?我知道这是在运行时确定的。
int arr[10]; //分配足够的内存来存储10个int,并使arr成为指向首地址的指针。
出现这个问题是因为我们无法使用运算符确定 malloc 内存块的大小。我的理解是,除了堆的使用之外,“普通”数组与 malloc 内存相同。
我无法理解为什么非堆数组和堆数组的行为不同。
当您将数组声明为
type name[count]
时,它会根据上下文在分配的空间中进行转换,并且 name
的值被分配为该字节块的首地址。例如,全局声明的 int32_t V[10]
被转换为 40 字节以在动态内存中分配,而在函数内部则被转换为 40 字节以在调用函数时保留在堆中。
运算符 sizeof
在编译时进行评估,因此编译器能够识别所需使用的空间,并且 sizeof(V)
返回 40
。
当您将指针声明为 type *name
时,编译时已知的唯一信息是分配用于保存其指向的地址的 sizeof(void *) 字节,因此编译器无法知道该变量的范围,它可以只是存储特定地址而不是指固定大小的内存。