【问题标题】:Function parameter as array with declared size函数参数作为声明大小的数组
【发布时间】:2015-03-10 18:04:15
【问题描述】:

我经常使用以下约定来通知客户端代码一个函数需要一个具有定义大小的数组的参数:

/* File foo.h */
int foo (int arg[10]);

我想给客户代码的信息是他们必须提供一个int类型的数组,有10个位置。

我知道这不是很常见,所以我来这里问:我错过了这个约定的任何副作用吗?无论如何有害吗?

谢谢!

【问题讨论】:

  • 为什么不使用int foo (int arg[/*10*/]);?评论维度
  • 为什么不使用int foo (int *arg, int elements);?
  • C Parameter Array Declarators 的可能重复项
  • @WeatherVane 它是为人类设计的,目的是让他们知道数组应该总是有 10 个元素。
  • 您可以将数组包装到一个结构中并传递一个指向该结构的指针。结构中的数组具有大小信息。

标签: c parameters


【解决方案1】:

如果你想坚持得到一个大小为 10 的数组,你可以使用:

int foo (int (*arg)[10]);

这样做的不良副作用是:

  1. 在函数中,你必须使用:

    (*arg)[index] 
    

    而不仅仅是

    arg[index]
    
  2. 调用函数必须使用:

    int array[10];
    foo(&array);
    

    而不是

    int array[10];
    foo(array);
    
  3. 您不能使用包含超过 10 个元素的数组。

    int array[20];
    foo(&array);   // Not OK.
    
  4. 您不能使用malloced 数组。

    int* array = malloc(sizeof(int)*10);
    foo(array);   // Not OK.
    

现在选择危害最小的解决方案。

【讨论】:

  • 至少,如果指针太大或已分配,将指针转换为数组是安全的:对于 3. : foo((void *)array)foo((int(*)[])array);对于 4.:foo((int(*)[])array) 等。
【解决方案2】:
struct arrayContainerTen{
  int data[10];
}
void aFunction(struct arrayContainerTen *pAnArray)
{
    size_t size = sizeof(pAnArray->data);
}
main()
{
     arrayContainerTen anArray;
     aFunction(&anArray);
}

【讨论】:

    【解决方案3】:

    这样写没有坏处。但请注意,编译器不会强制执行该要求。编译器会将这样的声明视为您编写的。

    int foo(int *arg);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多