可变长度数组的原型

我正在尝试编写一个在c中采用可变大小数组的函数。

void sort(int s, int e, int arr[*]){ ... } 

它表示对于可变长度数组,它需要在函数声明中有界。 那是什么意思? 我正在使用xcode 4.0,使用LLVM编译器2.0。

谢谢您的帮助。

如果您不使用C99可变长度数组,通常的解决方案是传入指向第一个元素的指针,以及要用于访问元素的任何索引。

这是一段打印出一系列数组的代码,类似于您尝试对其进行sort

 #include  static void fn (int *arr, size_t start, size_t end) { size_t idx; for (idx = start; idx <= end; idx++) { printf ("%d ", arr[idx]); } putchar ('\n'); } int main (void) { int my_array[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; fn (my_array, 4, 6); return 0; } 

这将输出4到6个元素(从零开始),给出:

 5 4 3 

有几点需要注意。

  • 在该函数中使用my_array调用fn自动将数组“衰减”为指向其第一个元素的指针。 当您使用数组时,这实际上发生在大多数(并非所有)情况下,因此您不必显式声明&(my_array[0])

  • C已经在标准库中内置了一个非常好的排序函数,称为qsort 。 在许多情况下,这就是你应该使用的东西(除非你有一个特定的算法要用于排序,或者你正在做家庭作业/自我教育练习)。

我看到没有人回答真正的问题,我在这里给我的。

在C99中,您有可变长度数组(VLA),它们的声明长度在运行时进行评估,而且不仅在编译时与C的早期版本一样。但是将数组传递给函数有点棘手。

一维数组总是作为指针传递

 void sort(size_t n, int arr[n]) { } 

相当于

 void sort(size_t n, int *arr){ } 

更高的尺寸很好地传递给了该function

 void toto(size_t n, size_t m, int arr[n][m]){ } 

相当于

 void toto(size_t n, size_t m, int (*arr)[m]){ } 

在这样的函数内部使用这样的定义,您可以使用表达式arr[i][j]访问元素,并且编译器知道如何计算正确的元素。

现在出现了您发现的语法,该语法仅对您转发声明函数接口的原型有用

 void toto(size_t, size_t, int arr[*][*]); 

所以在这里你可以用*替换数组维度作为占位符。 但是,只有当您没有手头的尺寸名称时,这才有用,并且使用与定义完全相同的版本要清楚得多。

 void toto(size_t n, size_t m, int arr[n][m]); 

通常,为了一致地使用它,在参数列表中首先获得尺寸是很重要的。 否则,当编译器解析arr的声明时,它们将不会被知道。

你想做什么让你的论证成为一个int * ; 传递数组的长度(调用者可能知道,但这个例程没有)作为一个单独的参数。 您可以将数组作为参数传递。

对于可变长度数组,数组括号内的*的使用仅限于原型,并且仅用作占位符。 稍后定义该函数时,数组的大小应存储在可用于任一文件范围的变量中,或存储为其中一个参数。 这是一个简单的例子:

 void foo(int, int[*]); /* asterisk is placeholder */ void foo(int size, int array[size]) { /* note size of array is specified now */ }