3

我通过传递值调用函数时遇到问题,这是测试代码

#include <stdio.h>

void sample(int b[3][2])
{
  int t;
  for(t=0;t<3;t++)
  {
    printf("value is =%d\n",b[t][0]);
  }
}

int main()
{

  int d[3][2]={(2,3),(4,2),(5,2)};

  sample(d[3][2]);
}

我收到一条错误消息,指出引用类型应该是 (*)[2] 而不是“int”。什么是正确的方法?

4

5 回答 5

4

您不能在 C 中按值传递数组:数组是按地址传递的。如果要按值传递数组,请将其包装在 a 中struct

struct with_array {
    int b[3][2];
};
void sample(struct with_array s) {
    ...
}
int main() {
    struct with_array arg = {.b = {{2,3},{4,2} ,{5,2}}};
    sample(arg);
}

PS如果您不需要按值传递,您的方法也可以固定。您需要在初始化时遵循正确的语法,并将整个数组传递给sample,而不是访问其元素之一(这也超出了数组的范围)。

于 2013-10-12T12:40:06.077 回答
1

采用:

sample(d);

代替:

sample(d[3][2]);

d[3][2]只是数组元素的值,这不是您想要传递的。

还:

int d[3][2]={(2,3),(4,2),(5,2)};

这不是您初始化数组的方式。

int d[3][2]={{2, 3}, {4,2}, {5, 2}};

是正确的方法。

于 2013-10-12T12:36:18.390 回答
1

您可以将数组包装在结构中或使用指向数组的指针。

#include <stdio.h>

void sample(int (*b)[3][2])
{
  for (int t = 0; t < 3; t++)
  {
    for (int i = 0; i < 2; i++)
    {
        printf("%d\n", (*b)[t][i]);
    }
  }
}

int main(void)
{

  int d[3][2]={{1,2}, {3,4}, {5,6} };

  sample(&d);
}

顺便说一句,您的代码在int d[3][2]={(2,3),(4,2),(5,2)};这里有错误(2,3)是一个逗号表达式,它产生 3 - 这不是一个数组。

于 2013-10-12T13:29:42.310 回答
0

d[3][2]指向数组中不存在的元素d。采用:

sample(d);
于 2013-10-12T12:36:45.913 回答
0

编译器解释

void sample(int b[3][2])  

作为

void sample(int (*b)[2]) 

((这背后的原因是数组衰减为指针一次,它不会递归发生。数组数组衰减为指向数组的指针。))

通行证可以dint (*)[2]类型的。

sample(d);  

而不是传递d[3][2]which 是类型int,而且这个数组元素超出了数组范围。

于 2013-10-12T12:38:27.277 回答