【问题标题】:C language difference between array and array parameter passed to function [duplicate]传递给函数的数组和数组参数之间的C语言差异[重复]
【发布时间】:2020-01-26 17:19:01
【问题描述】:

两个注释函数返回完全相同的内存地址。那么为什么我可以从数组变量(指向第一个元素的指针)中获取正确的大小,而当似乎完全没有区别(完全相同的内存地址)时,我无法从数组指针(数组参数)中获取大小:

#include <stdio.h>

void arraySize(int arr[]) {
    printf("%p\n", arr); // same memory address
    printf("%lu\n", sizeof(arr) / sizeof(arr[0])); // different result
}

int main() {
    int a[] = {1,2,3,4,5};
    printf("%p\n", a);  // same memory address
    printf("%lu\n", sizeof(a) / sizeof(a[0])); // different result
    arraySize(a);
    return 0;
}

【问题讨论】:

  • arraySize 实际上收到的是指向数组第一个元素的指针,而不是数组对象。在函数参数声明中,int arr[] 被解释为int *

标签: c arrays pointers memory-address


【解决方案1】:

在 main 中,a 是一个数组,它是在本地分配的,因此它的大小将始终是元素数乘以 sizeof(int)。 但是,在调用函数时,会传递一个指向数组的指针(数组第一个元素的地址)并存储在堆栈中。在函数内部打印时,实际上是在打印指针的大小,而不是数组的大小。 在 64 位系统中指针大小为 8 字节,在 32 位系统中为 4 字节。

【讨论】:

    【解决方案2】:

    因为您不能将数组作为参数传递给函数——数组不是 C 中的一等类型,您不能对它们做太多事情。因此,如果您尝试将函数声明为将数组作为参数,编译器会默默地将其转换为您的指针。所以在函数中,你根本没有一个数组——你有一个指针,而 sizeof(arr) 给你一个指针的大小,而不是转换为传递给指针的数组的大小函数。

    【讨论】:

    • 为什么这条评论被否决了?有人可以(最好是反对者解释这里有什么问题吗?)
    • 这是正确答案。更具体地说,C 标准要求将“T 数组”类型的参数调整为“指向 T 的指针”类型(例如 C99 标准,第 6.7.5.3 节第 7 段)。
    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多