【问题标题】:C pointers and arrays/ 'sizeof' operator [duplicate]C指针和数组/'sizeof'运算符[重复]
【发布时间】:2013-01-12 22:40:10
【问题描述】:

可能重复: Stack pointer difference for char pointer and array

为了说明我的问题:

int main(void){
    int myary[20];
    int *myaryPtr;
    myaryPtr = myary;

    sizeof(myary); // Will it return 80? Correct?
    sizeof(myaryPtr); // Will it return 4? Correct?
    return 0;
}

首先,我的假设是否正确?

然后假设我的假设是正确的,详细解释是什么?我知道我的 20 元素数组是 80 字节,但名称 myary 不只是指向数组第一个元素的指针吗?那么不应该也是4吗?

【问题讨论】:

  • sizeof(int) == 4sizeof(int *) == 4 为准,第一个通常是这种情况,第二个适用于 32 位系统(sizeof(int *) == 8 在 64 位系统上),您的假设关于sizeof 是正确的。数组与指针不同——见证sizeof 的不同结果。但这一定是许多其他问题的重复......困难在于找到它们。
  • 抱歉,我很难找到与我的确切问题相匹配的问题。
  • 您可能想阅读comp.lang.c FAQ 的第 6 部分。

标签: c arrays pointers sizeof


【解决方案1】:

是的,你的假设是正确的,假设 int 和指针在你的机器上都是 4 字节长。

不,数组不是指针。在某些上下文中,数组名称有时会衰减为指针,但它们不是一回事。有一个whole section of the comp.lang.c FAQ 专门针对这个常见的混淆点。

【讨论】:

  • 最简单的例子是数组char string[] = "test"占用5个字节,而指向数组char *string = "test"的指针占用5个字节作为字符串,sizeof(char *)占用指针本身。
  • 好的,那么数组是它所在函数中的对象,然后数组在传递给其他函数时衰减为指针?
  • 什么时候数组名被认为是指针?
  • @Aposperite,您可能想要的所有详细信息都在我在回答中链接的常见问题解答中。
  • @Aposperite:仅举几例,数组上的& 运算符会生成指向数组的指针。另外,sizeof.
【解决方案2】:

无论您声明为int myArr[20] 还是int* myArrPtr,数组的大小都不会存储在内存中。

发生的情况是sizeof() 被(由编译器)替换为常量值

因此,因为myArr 在编译之前被指定为固定大小,所以编译器知道分配的内存量有多大。使用myArrPtr,您可以动态分配不同的数组大小,因此只存储 type 的大小。

【讨论】:

  • sizeof 并不总是恒定的 - 例如,它适用于 VLA。
  • 在这种情况下,编译器可以用n * sizeof(int) 替换sizeof(int vla[n]),其中sizeof(int) 将是一个常量。还有上面提到的第6.15节FAQ
  • 这正是它的作用。我只是为了清楚起见而发表评论,因为您的回答说它已被常量替换,但情况并非总是如此。
  • 非常正确。但是,我上次尝试使用 VLA 时没有使用 VLA 的经验,我得到了编译器错误/警告,所以我坚持使用 malloc/free
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多