如何通过值变量大小数组传递(到函数)?

时间:2014-07-06 15:49:03

标签: c

首先,我知道当我们调用函数f(int a[]) and f(int *p)时,数组A会降级为指针。

BUT:

1.I really need sending by value all array.
2.I really need that sending size is non const in function (but const size in plase we calling function)

我写了一些例子:

http://ideone.com/ZbW0wT

#include <stdio.h>
#define SZ 15
typedef struct {int a[SZ];} rec;
int main(){
        void pa(rec);
        int value[SZ] ={9,8,7,6,5,4,3,2,1,0};
        pa(*(rec*)value);
        printf("%u %u\n",sizeof(rec),sizeof(value));
        return 0;
}
void
pa(rec b){
        int z;
        for(z=0;z<SZ;z++){
            printf("array[%2d] is %d\n",z,b.a[z]);
        }
}

这段代码适用于const大小,但是如何改变这样的pa会得到一些rec大小取决于传递的数组?

更新:它必须通过值传递,但不是像Pascal等那样的const大小,但是在真正的C方式中,所有传递值都不是通过0元素上的指针

并且函数需要通用,因此用户可以编写func(variablesizeArrayOfT),其中arg通过值传递。

如果可能需要标准方式(C11或更好的C99或更好的C89或更好的K&amp; R),如果不能然后gcc

UPD2:http://ideone.com/H4XGqC     #include

typedef struct{
        int     len;
        int     a[];
} av;

void f(av a){
        while(a.len--){
            printf("array[%2d] is %d\n",a.len,a.a[a.len]);
        }
}

int main(){
        int b[]={3,1,2,3};
        int c[]={7,1,2,3,4,5,6,7};
        f(*(av*)b);
        f(*(av*)c);
        return 0;
}

所有好的可能是错位,因此大小(3和7)是正确的但是[]的值不是

UPD3见throw gcc -g -c 2ndSRC.c&amp;&amp; objdump -d -M intel -S 2ndSRC.o

它只发送大小(b [0]和c [0])但不是所有数组

1 个答案:

答案 0 :(得分:0)

在C中使用包含可变长度数据的数组的惯用方法是使用在编译时已知的最大大小的缓冲区,这是你想要的吗?

#include <stdio.h>

#define MAX_SIZE 15
typedef struct {
    int arr[MAX_SIZE];
    size_t arr_len;
} rec_t;

void pa(rec_t rec){
    for(int z=0; z<rec.arr_len; z++){
        printf("array[%2d] is %d\n", z, rec.arr[z]);
    }

}

int main(void){
        rec_t rec ={
            .arr = {9,8,7,6,5,4,3,2,1,0},
            .arr_len = 10
        };
        pa(rec);
}