让我们举个例子:--
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 个)元素,是一个值为 1
的 int
对象。 &arr[0]
是该 int
对象的地址,类型为 char*
。因此这也会导致 p
指向数组 arr
的初始元素。
完成此分配后,您可以使用 arr
或 p
作为索引运算符的前缀。索引运算符实际上定义为采用指针而不是数组作为其前缀,因此 arr[0] 使用数组到指针转换的结果,使其与 相同p[0]
.
但是arr
和p
仍然不能总是互换使用。例如,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/