未知类型数组作为c中的参数

时间:2016-08-30 14:14:55

标签: c parameter-passing void-pointers

这只是一个测试,只是为了理解它是如何工作的。但我不明白为什么我得到这个输出。

#include <stdio.h>

void f(void *a[]){
    for(int t=0; t<5;t++){
        printf("--%d--",a[t]);
    }
}

void main(void){
    int a[5]={1,2,3,4,5};
    f(a);
}

所以我得到了这个输出:

  

- 1 ---- ---- 3 5 ---- ---- 428351232 4195936 -

3 个答案:

答案 0 :(得分:2)

你告诉函数期望一组void*指针。函数返回值也不正确,循环增量异常。试试这个:

#include <stdio.h>

int f(int a[]){
    int r = 0;
    for(int t = 0; t < 5; t++){
        printf("--%d--", a[t]);
    }
    return r;
}

void main(void){
    int a[5]= { 1, 2, 3, 4, 5};
    f(a);
}

节目输出:

--1----2----3----4----5--

如果您启用了所有编译器警告,则会向您显示这些错误。

答案 1 :(得分:1)

根据你的标题,你需要一个接受一个数组类型未知的数组的函数。没有这样的函数,因为没有数组永远作为C中的函数参数传递。相反,如果指定函数参数的表达式求值为数组,则该数组进一步“衰减”为指向数组的第一个元素,它是传递的指针。实际上,在几乎所有情况下,数组都会衰减为指针。

不要被愚弄:C允许您通过在其他地方指定数组的语法来指定函数参数类型,但这是一个方便的功能。这种方式指定的实际参数类型是相应的指针类型。如果您愿意,可以编写匹配的变量和函数参数声明。

现在,因为它不是你传递的未知(到函数)类型的数组,而是指向这样一个数组的第一个元素的指针,你的问题归结为“我如何指定一个可以指定的指针类型拿着指向任何类型的指针?“我打赌你知道的那个:void *是常规方式,但char *也有效:

void f(void *a) {
    // ...
}
然而,单凭这一点并没有太多可以做到的。与标准库函数qsort()的接口相比较,它实际上只接受这样的指针。为了能够使用指针,它还需要指定每个数组元素的大小和元素数量的参数,并且为了特定目的,它还接受指向适合比较这些元素的函数的指针。

更新

qsort()模型之后,如果你想要一个打印任何数组元素的函数,你可以这样做:

void print_elements(void *first, size_t element_size, size_t element_count,
        void (*print_element)(void *)) {
    char *element = first;  // pointer arithmetic is not allowed on void *

    for (size_t index = 0; index < element_count; index++) {
        print_element(element);
        element += element_size;
    }
}

然后您可以像这样使用它:

void print_int(void *intp) {
    printf("--%d--", *((int *) intp));
}

void main(void){
    int a[5] = { 1, 2, 3, 4, 5 };

    print_elements(a,
            sizeof(a[0]),              // The size of each element
            sizeof(a) / sizeof(a[0]),  // The number of elements
            print_int);                // A pointer to a suitable print function
}

答案 2 :(得分:-1)

在函数中,您必须将向量转换回整数,以便编译器可以知道数组元素的宽度,并且当您想要访问数组的元素时它可以添加适当的偏移量。 / p>

所以正确的代码是:

void f(void *a[]){
    int *v=(int *) a;
    for(int t=0; t<5;t++){
        printf("--%d--",v[t]);
    }
}