C 如何将结构数组从一个函数传递到另一个函数?

C 如何将结构数组从一个函数传递到另一个函数?,c,C,可能重复: 将一个结构数组从一个函数传递到另一个函数的最佳方法是什么 假设我有 funcion1(){ struct album_ { int num_tracks; struct tracks_ tracks; int playlist_hits[]; }; typedef struct album_ album; album all_album[50]; } function2(){ } 我如何通过all_相册[50]到函数2()?无效myFu

可能重复:

将一个结构数组从一个函数传递到另一个函数的最佳方法是什么

假设我有

funcion1(){
   struct album_ {
   int num_tracks;
   struct tracks_ tracks;
   int playlist_hits[];
   };
   typedef struct album_ album;
   album all_album[50];
}

function2(){
}
我如何通过
all_相册[50]到函数2()?

无效myFunc(相册*A,int N)
{
int i;
对于(i=0;i
结构类似于任何其他类型。可以像传递整数数组一样传递它。如果将(如上所述)声明为全局,则根本不需要将其作为固定大小的数组或指针和大小对进行传递

struct tracks_ {
};

struct album_ {
  int num_tracks;
  struct tracks_ tracks;
  int playlist_hits[];
};
typedef struct album_ album;
album all_album[50];

void foo(album all_album[50]) {
 //passes this way
}

void foo2(album* all_album, size_t size) { //or degrades to a pointer
}

int main() {
   foo(all_album);
   foo2(all_album, 50);
}

要将任何类型为
T
的数组传递给函数,通常需要编写一个函数,该函数接受指向T的指针和一个单独的大小参数:

void foo(album *a, size_t size) { ... }
向其传递数组表达式和大小:

int main(void)
{
  ...
  album all_album [N];
  ...
  foo(all_album , sizeof all_album / sizeof *all_album )
  ...
}
除非它是
sizeof
或一元
&
运算符的操作数,或者是用于初始化声明中另一个数组的字符串文字,否则“T
的N元素数组”类型的表达式将替换为“指向
T
的指针”类型的表达式其值是数组第一个元素的地址

瞧,当你写作的时候

foo(all_album, sizeof all_album / sizeof *all_album);
发生了几件事

  • 第一个
    all_-album
    表达式替换为一个指针表达式,其值为
    &all_-album[0]
    ;这就是为什么
    foo
    定义中的
    a
    类型具有类型
    album*

  • all_album表达式的大小计算为数组中的总字节数。由于
    all\u album
    sizeof
    运算符的操作数,因此不会将其转换为指针表达式

  • sizeof*all_album
    表达式计算为
    album
    类型的单个对象中的字节数。由于
    all\u album
    不是
    sizeof
    的操作数(表达式
    *all\u album
    是操作数),因此首先将其转换为“指向
    album
    的指针”类型的表达式。将
    *
    操作数应用于该指针表达式,生成类型为
    album
    的新表达式,该表达式由
    sizeof
    计算

  • 计算
    sizeof all_album/sizeof*all_album
    ,得到数组中的元素数。此值作为
    foo
    定义中的
    size
    参数传递


  • 但是它是在另一个函数中创建的。与调用
    myFunc()
    中的
    50
    不同,您可以使用
    sizeof MyAlbums/sizeof*MyAlbums
    并避免再次使用神奇常数:)pmg是正确的,但仅适用于堆栈上的数组。sizeof()不应应用于malloc'd或new'd数组。
    foo
    没有做您认为它正在做的事情。在函数参数声明的上下文中,
    ta[N]
    ta[]
    ta*a
    相同;在函数
    foo
    中,
    all\u album
    是指针,而不是数组。
    foo(all_album, sizeof all_album / sizeof *all_album);