【问题标题】:Size of a dynamically allocated integer array [duplicate]动态分配的整数数组的大小 [重复]
【发布时间】:2013-04-19 09:49:47
【问题描述】:

我正在处理一个类型的函数:

 int xyz(int input[])

我无法访问 main 函数,因此不知道数组的大小。 如何找到输入数组的大小? 有没有办法知道数组的结束位置? sizeof(input)/sizeof(int*) 给出 1,因为输入基本上是一个指针。

【问题讨论】:

  • sizeof(input) 等价于sizeof(int *)。因此,sizeof(input)/sizeof(int*) 将始终返回 1
  • 您可以更改函数以获取额外的参数存储长度。或者,您可以将标记值存储在数组的末尾(如以 null 结尾的字符串)。
  • 这不是重复的 - 在这个问题中“我无法访问主函数,因此不知道数组的大小。”因此需要一种解决方法或可能的洞察力来解决问题,而链接的问题假设您可以开始从调用者传递参数的数量。

标签: c


【解决方案1】:

如果调用者没有提供有关数组的大小信息,则无法在函数 xyz() 中获取大小。

您可以在另一个变量中传递大小信息(或作为数组的一个元素)。

int xyx(int abc[], size_t len)
{

}

【讨论】:

  • int[] 是否简化为整数指针是像“int xyz(int input[])”这样的语句?这样的语句在 C 中合法吗?我的意思是,我们可以使用 input[] 作为参数吗?如果是,它会减少为指针吗?
  • 除非我错了,否则我们不能在 C 函数中传递数组是吗?
  • @SheerFish 是的,是的,是的。
  • @SheerFish 是的。 int xyz(int input[]){} 是合法的 C。int xyz(int input[]){}int xyz(int *input){} 是绝对等价的。当一个数组被传递给一个函数时,它会作为一个指针衰减。
【解决方案2】:

不...在被调用函数中没有(可移植的)方式,因此在这种情况下(即没有传递元素数量参数时)调用者采用某种约定(例如提供标记值)是正常的在最后使用的元素中或保证一定数量的元素。如果使用了哨兵,您可以通过在调试器中检查调用代码来向自己证明这是完成的。

【讨论】:

  • sizeof(input)/sizeof(int*) 是否因为“input”也不过是一个整数指针而减少到一?
  • 完全正确 - 对于函数参数,数组被接受为指针。 sizeof(array) 仅在程序的该部分中知道数组维度时才有效。考虑到sizeof 总是在编译时进行评估,函数f(int a[]) 完全有可能被不同大小的数组调用两次,所以这是不可能的情况。 (在 C++ 中,您可以使用模板:template <size_t N> void f(int (*)[N]) { /* now N holds the array size */ }。)
【解决方案3】:

如果将数组传递给函数但不提供长度,则找不到它,因为数组衰减为指针,其大小始终为 32 (64) 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 2011-01-03
    • 2020-06-26
    • 2020-11-26
    • 1970-01-01
    • 2021-07-11
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多