2014-02-23 78 views
1

我想是这样的:如何通过值发送数组以在c中运行?

typedef struct vec{ 
    int sz; 
    int v[]; 
} ff; 

int sum(struct vec z){ 
    int o=0,i; 
    for(i=0;i<z.sz;i++) 
     o+=z.v[i]; 
    return o; 
} 

int main(){ 
    int test[]={10,1,2,3,4,5,6,7,8,9,10}; 
    return sum((struct vec)test); 
} 

但是这个例子的代码无法编译。如何通过值发送数组(不参考抛出指针)的功能?

+0

您将需要指定数组的确切大小,例如'int v [10]'in 'struct vec'的定义。 – Marian

+0

当然它不会编译(struct vec)测试;你正试图将一个数组转换成一个结构体,而你不能那样做。 /你应该声明一个struct类型的变量,相应地初始化它,并通过它来求和(...) – Pandrei

回答

2

在你的榜样,你将需要指定的struct vec定义数组的确切大小,例如INT v [10]。你的初始化也可以写得更好。尝试:

#define MAX_SIZE 50 
struct vec { 
    int sz; 
    int v[MAX_SIZE]; 
}; 

int sum(struct vec z){ 
    int i, o; 
    o = 0; 
    for(i=0; i<z.sz; i++) o += z.v[i]; 
    return o; 
} 

int main(){ 
    struct vec test = {10, {1,2,3,4,5,6,7,8,9,10}}; 
    return sum(test); 
} 
+0

可能是。 但也许存在一些方法(不是大开关evry可能大小的vec,但proc或宏使功能,使用一些信息的非正式调用(如vararg)获取信息有多大的getted数据? – qulinxao

3

不能通过值C.发送阵列每当你尝试到一个数组传递给函数的时候,你会的指针传递给第一个值。
按值传递数组,你可以骗一点,在一个结构封装它,和值发送(所以它会被复制)......这是一个肮脏的黑客,as explained here,但是好了,如果你真的想那它工作。
另一种方法是在指定的指针内复制函数内的数组。

1

虽然这是真的,在C的阵列的尺寸,该尺寸只能通过操作者sizeof只有原来的阵列上访问,然后。您不能将数组强制转换为结构,希望编译器能够填充所有字段。

实际上,它实际上是不可能将数组传递给函数“按值”。所有阵列衰减指针,所以当你传递一个数组到一个函数接收一个指针的函数。指针的衰减也是为什么你只能在原始数组上使用sizeof运算符,一旦它衰减到一个指针,编译器不知道它实际上指向一个数组,所以使用sizeof运算符(即使在指向一个数组)将返回指针的大小,而不是它指向的内容。

在你的情况,这将是简单的改变你的函数取两个参数,指针到数组和条目的数组中的号码:

/* `array` is an array containing `elements` number of `int` elements. */ 
int sum(const int *array, const size_t elements) 
{ 
    ... 
} 

int main(void) 
{ 
    ... 
    printf("Sum = %d\n", sum(test, sizeof(test)/sizeof(test[0])); 
} 
0

数组总是通过引用传递在C中,你不能改变它。

你可以做的是使阵列的副本,并通过新的数组中的功能

0

作为他人注意,在C的唯一途径来传递由值的阵列是使用struct具有固定尺寸数组。但这不是一个好主意,因为数组大小将被硬编码到struct定义中。

但是,你真的不应该尝试按值传递数组。相反,你应该做的是简单地声明指针参数作为const,像这样:

int sum(size_t count, const int* array) { 

虽然这并不按值传递的阵列,它阐明的意图不改变数组,我。即您现在可以将sum()视为按照值传递数组。
如果函数确实没有改变阵列(如您的sum()功能),使用const指针免费的午餐,复制数组按值传递它只是浪费时间。
如果你的函数真的想更改一个私人副本,请在函数中明确地做。如果数组不会太大,您可以简单地将它分配到堆栈上,如下所示:

int doSomethingWithPrivateCopy(size_t count, const int* array) { 
    int mutableCopy[count]; 
    memcpy(mutableCopy, array, sizeof(mutableCopy)); 
    //Now do anything you like with the data in mutable copy. 
} 
相关问题