【问题标题】:size of array in C without sizeof and not in main function [duplicate]C中没有sizeof且不在主函数中的数组大小[重复]
【发布时间】:2022-01-30 14:06:03
【问题描述】:

我想了解如何在不使用 sizeof 且不在 main 函数中的情况下知道数组的大小。 我真的很想了解为什么我的代码在其他函数中执行时不起作用。(在 main 中它与 sizeof 相同)。 >>> 我得到的结果是一些垃圾号码

*with char array 可以理解,但我不知道如何使用其他数据说明符。

#include <stdio.h>

void arrSize(int a[],int b[]){
    int size_a = *(&a+1) - a;
    int size_b = *(&b+1) - b;
    printf("%d,%d",size_a,size_b);
}

int main(){
    int arr[] = {2,12,14,16};
    int brr[] = {8,53,2,4,16};
    
    arrSize(arr,brr);

    return 0;
}

【问题讨论】:

标签: arrays c pointers implicit-conversion function-declaration


【解决方案1】:

这个函数声明

void arrSize(int a[],int b[]){
    int size_a = *(&a+1) - a;
    int size_b = *(&b+1) - b;
    printf("%d,%d",size_a,size_b);
}

由编译器调整为以下声明

void arrSize(int *a,int *b){
    int size_a = *(&a+1) - a;
    int size_b = *(&b+1) - b;
    printf("%d,%d",size_a,size_b);
}

即具有数组类型的参数被编译器调整为指向数组元素类型的指针。

另一方面,在这个电话中

arrSize(arr,brr);

数组被隐式转换为指向它们的第一个元素的指针。

拥有指向数组第一个元素的指针,您无法确定指针指向的数组大小。

这些声明中的初始化器

    int size_a = *(&a+1) - a;
    int size_b = *(&b+1) - b;

调用未定义的行为,因为您正在取消引用不指向有效对象的指针。

【讨论】:

  • 我猜你忘了在第二个版本中用星号更改方括号。
  • 那么在主函数之外没有办法确定给定数组的大小吗?
  • @bennyhassan 如果数组没有标记值,那么这是不可能的。我没有考虑传递指向整个数组的指针的情况,例如 int a[5];无效 f( int ( *p )[5] ); f(&a);
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多