gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:42:40 24 4
gpt4 key购买 nike

让我们举个例子:--

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;

这是无效的。 &arrint(*)[10] 类型,或指向 10 个 int 数组的指针。 pint* 类型。类型不兼容。任何符合标准的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com