c - C编译器是否为用于声明数组的变量名分配内存?

标签 c arrays

让我们举个例子:--

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = NULL;

对于变量arr,会不会有内存分配??

现在,如果 => 会发生什么

p = arr;
p = &arr;
p = &arr[0];

请帮助我理解这一点。

最佳答案

本声明:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

导致分配10 * sizeof (int)字节来保存10个元素的数组对象。 (没有为任何指针对象分配空间。)数组按指定初始化。

int *p = NULL;

创建单个指针对象并将其初始化为包含空指针值。

p = arr;

arr 是数组类型的表达式。在大多数情况下,它的值会隐式转换为指向其第一个元素的指针。因此,此赋值使 p 指向 arr 的第一个(第 0 个)元素; *p == 1

p = &arr;

这是无效的。 &arr 的类型为 int(*)[10],或指向 10 个 int 数组的指针。 p 的类型为 int*。类型不兼容。任何符合标准的 C 编译器都必须诊断此错误。 (诊断可能是一个非致命警告,但不要让它欺骗您;它仍然是一个错误,C 标准称之为“约束违规”。)

p = &arr[0];

这与p = arr;相同。 arr[0] 是数组的第一个(第 0 个)元素,是一个值为 1int 对象。 &arr[0] 是该 int 对象的地址,类型为 char*。因此这也会导致 p 指向数组 arr 的初始元素。

完成此分配后,您可以使用 arrp 作为索引运算符的前缀。索引运算符实际上定义为采用指针而不是数组作为其前缀,因此 arr[0] 使用数组到指针转换的结果,使其与 相同p[0].

但是arrp仍然不能总是互换使用。例如,sizeof arr 给出数组对象的大小 (10 * sizeof (int)),而 sizeof p 给出数组对象的大小指针的大小 (sizeof (int*))。

建议阅读:comp.lang.c FAQ 第 6 节.

(为了回答标题中的问题,编译器不会(或者至少不需要)在运行时为数组的名称分配内存。它不会在运行时分配 3 个字节的内存,因为您将数组命名为 arr,或者 22 个字节,因为您将其命名为 array_with_a_long_name。这样做可能是出于调试目的,但随后任何此类您的程序无法访问分配的空间。)

关于c - C编译器是否为用于声明数组的变量名分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478680/

相关文章:

python - Cython:从 C 程序调用 Python 代码

c - c中的段错误

c++ - 线程可以在对内核的系统调用中被抢占吗?

javascript - 在哪里/如何设置循环增量并仅在找到条件时更新数组?

javascript - 使用 Math.random 时如何避免获得两个相同的数组?

c - 为什么我的用户定义数组的平均值不正确? C

c - 退出循环时数组的值发生变化

c - 在C函数中对数组排序

java - 切换到循环列表以更轻松地移动

javascript - ReactJS 数组中出现随机逗号