在函数中使用main中的数组(C)

时间:2013-11-14 12:24:39

标签: c arrays qsort

有没有办法在另一个函数中使用main()中定义的静态数组,而不将其作为参数赋予函数?

例如:

main()定义了数组:

int Array[10];

填充整数。我想为qsort创建一个比较函数,它必须有这个标题:

int compar (const void* a, const void* b);

我想这样决定:

if Array[a]<Array[b] return 1

等...

此数组不能直接提供给qsort,但需要精确排序。

此外,此数组必须是静态的(无需重新分配)。

有没有人有任何想法?

4 个答案:

答案 0 :(得分:3)

当然,唯一的方法是将数组的地址作为全局变量提供。

即使数组本身在main()内,这也是可能的,但是你必须将全局初始化为正确范围的地址,并且当然要注意生命时间。

int *mains_array;

static int qsort_callback(const void *a, const void *b)
{
  /* use mains_array */
}

int main(void)
{
  int secret_array[100];

  mains_array = secret_array;
  qsort(something, something, qsort_callback);
}

这是一个非常难看的解决方案,应该多考虑一下。

答案 1 :(得分:1)

您无法从其他功能访问本地变量。您需要将其设置为全局或文件作用域。

全局:

/* Declare Array outside any function */
int Array[10];

int main(...

或,文件作用域:

/* Declare Array outside any function */
static int Array[10];

int main(...

注意:

您的比较函数将接收要比较的元素的指针。如果要对int数组进行排序,则需要在比较函数中取消引用指针:

我假设Array不是您要排序的数组,而是一个包含有关如何对数组进行排序的信息的数组。

int compare (const void * ap, const void * bp)
{
    int a = *((int*)ap);
    int b = *((int*)bp);

    if (Array[a] < Array[b]) {
      return 1;
    }
    if (Array[a] > Array[b]) {
      return -1;
    }
    return 0;
}

答案 2 :(得分:0)

qsort需要数组的地址,因此您无法选择。但是定义数组的位置无关紧要。你只需要能够参考它。

qsort签名是:

   void qsort(void *base, size_t nmemb, size_t size,
              int (*compar)(const void *, const void *));

所以你会通过以下方式来称呼它:

qsort(Array, 10, sizeof(int), compar);

你会像往常一样做比较功能:

int compar (const void* a, const void* b) {
    return *((int*)a) - *((int*)b);
}

您需要了解传递给compar的值不是索引,而是数组单元格的地址。因此,您不必使用Array函数中的compar,您已经拥有了所需的内容。

答案 3 :(得分:0)

你已经通过拨打

给了他你的阵列
qsort (a, numberOfElements, sizeOfEachElement, compare);

比较功能需要做的是:

int compare (const void * a, const void * b)
{
    //Here int can be other type
    return ( *(int*)a - *(int*)b );
}