arrays - 无论数组元素的数量如何,函数中数组的 c sizeof 函数始终为四个字节

标签 arrays function-pointers sizeof

当我打印(数组的大小/第一个元素的大小)时,我得到了正确的答案,但是当我在函数中执行相同的操作时,我得到数组的大小为 4 并且数组第一个元素的大小为 4,因此除法始终为 1。

#include<stdio.h>
int sizer(int *); 

int main()
{
    int num;
    printf("Please an index: ");
    scanf("%d",&num);
    int array[num];
    int size = sizer(array); //function to calculate array length

    /*answer is always 4*/
    printf("%d\n", size); 

    /*answer is correct*/
    printf("%d\n", sizeof(array) / sizeof(array[0])); 

    return 0;
}

/*function to calculate array length*/
int sizer(int *array)
{
    return sizeof(array) / sizeof(array[0]);
}

最佳答案

sizeof不是一个在运行时调用的函数,尽管它看起来像一个。这是编译器的一个功能。它查看数据对象并替换 sizeof()带有常数的表达式。

int arr[10];
int size = sizeof(arr)/sizeof(int);

这是有效的,因为编译器可以看到 arr 有多大是。 arr这里是一个静态大小的数组。两者sizeof表达式被替换为适当的值。

int arr[10];
int size = sizer(arr);
....
int sizer(int array[]) {
    return (sizeof(array)/sizeof(int));
}

这行不通。在 sizer , array看起来像一个数组,但作为参数传入的数组实际上只是指向数组类型的指针。所以sizeof(array)相当于 sizeof(int *)

scanf("%d",&num);
int arr[num];
int size1 = sizeof(arr)/sizeof(int);
int size2 = sizer(arr);
....
int sizer(int array[]) {
    return (sizeof(array)/sizeof(int));
}

在这里,size1有效,但是size2没有。创建arr实际上是这样分配的:

int arr_sizeof = sizeof(int)*num;
int *arr = alloca(arr_sizeof);

然后,sizeof(arr)悄然被arr_sizeof取代。但编译器只能在arr相同的范围内执行此操作。被创建,因为当 arr被传递到sizer它只是转换为 int *同样,因此尺寸信息不会被保留。 sizer由于同样的原因失败,函数参数中的数组只是作为简单指针传递。

关于arrays - 无论数组元素的数量如何,函数中数组的 c sizeof 函数始终为四个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296706/

相关文章:

c++ - 什么是 void(*)(void *)

c - struct - 使用 sizeof() 的最佳方法

java - mySQL数据库结构

JavaScript 仅通过 messageid 将对象创建为数组

c++ - C++有没有类似于Fortran的冒号A[2][:]?的数组占位符

c - 什么决定了整数的大小?

c - C语言中sizeof(struct structname)和sizeof(object)的区别

python - 多维数组快速排序

c++ - 函数指针 vector

c - 函数指针存放在哪里?