1

我尝试了类似的东西:

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);
}

但是这个示例代码无法编译。如何按值(不是引用抛出指针)发送数组到函数?

4

5 回答 5

3

您不能在 C 中按值发送数组。每次尝试将数组传递给函数时,都会将指针传递给第一个值。
要按值传递数组,您可以稍微作弊并将其封装在结构中,然后按值发送(因此将被复制)......这是一个肮脏的黑客,如此处所述,但是,如果你真的想要那,它的工作原理。
另一种方法是在给定的指针的情况下复制函数内部的数组。

于 2014-02-23T13:57:27.333 回答
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);
}
于 2014-02-23T14:01:38.777 回答
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]));
}
于 2014-02-23T13:58:06.853 回答
0

正如其他人所指出的,在 C 中按值传递数组的唯一方法是使用struct具有固定大小数组的 a 。但这不是一个好主意,因为数组大小将被硬编码到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.
}
于 2014-02-23T14:06:52.257 回答
0

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

您可以做的是复制数组并在函数中传递新数组

于 2014-02-23T13:58:12.973 回答