有一段时间,我假设存储数组的变量实际上只是指向数组第一个元素的指针,例如 char argv[][]
和 char **argv
似乎可以互换,但最近了解到 sizeof 运算符正确返回底层数组的大小。那么数组变量是否存储为宽指针?为什么将数组传递给函数时 sizeof 会失败?
我很抱歉这可能有点,但作为一个来自低级 Rust 的人,C 中的数组真的让我感到困惑。
最佳答案
How are array variables stored in C? (not the memory itself but the pointer in the named variable)
数组的存储方式与其他对象类似:int
、struct
等。每个数组都存在于内存中,从某个地址开始*1并占用 sizeof object
字节。
一个对象,无论是否是数组,都有一个地址。数组的每个元素都有一个地址。
are array variables stored as wide pointers?
没有。
Why does sizeof fail when the array is passed to a function?
sizeof
不会失败。就是当数组传递给函数时,它首先被转换为第一个元素的类型和地址。该函数接收一个指针,而不是一个数组。下面打印数组 a
的大小(例如 12),然后打印指针 ptr
的大小(例如 2、4 或 8)。期望 sizeof ptr
为数组的大小并不是语言方面的失败。
int foo(int *ptr) {
printf("%zu\n", sizeof ptr);
return 0;
}
int main() {
int a[3] = { 1,2,3,};
printf("%zu\n", sizeof a);
return foo(a);
}
arrays in C are really confusing me.
记住数组不是指针并且指针不是数组是有用的。
Is there a reason why you can't pass an array as an argument like in rust and why it always decays?
...因为C语言就是这样定义的。它在当时被认为是一个很好的设计,并且经过 40 多年的使用,至少是一个合理的选择。
*1 存储在寄存器中的对象没有地址。
关于arrays - C语言中数组变量是如何存储的? (不是内存本身,而是命名变量中的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76617676/