将数组传递给C中的结构

时间:2014-11-26 15:20:38

标签: c arrays struct c89

为了用整数填充结构(然后在程序中进一步传递),我认为以下方法可行:

main() {
struct songs {int pitch[5], length[5];} songs[4];
int i[5]={1,22,23,14,52};
int k=0;
 songs[0].pitch=i;      
 for (k=0; k<5; k++) printf("%d\n",songs[0].pitch[k]);
}

然而,这会导致错误&#34;分配中的不兼容类型&#34;

如果我不将此数组传递给结构,请使用以下命令:

main() {
int i[5]={1,22,23,14,52};
int k=0;   
 for (k=0; k<5; k++) printf("%d\n",i[k]);
}   

它会编译并显示数组的内容。

我意识到可能有一个简单的解决办法,但任何帮助都会很棒!

提前致谢

7 个答案:

答案 0 :(得分:6)

C89不允许您将数组分配给另一个数组。这里是C99的相关位,但C89中的文本大致相同,只提到仅C99类型_Bool。 (我只有C89的纸质副本)

Simple Assignment section

阵列不适合任何这些条件 - 它们不是算术类型,它们不是结构或联合类型,并且它们不是指针 1 < / SUP>。因此,您无法在其上使用赋值运算符。

但是,您可以使用memcpy。如果你替换这一行:

songs[0].pitch=i; 

这一行:

memcpy(songs[0].pitch, i, sizeof(i));

你会得到你期望的行为。 (当然首先包括<string.h>


1 从技术上讲,6.3.2.1/3表示数组在被operator=看到之前被转换为 rvalue 指针,但这样的赋值仍然被禁止,因为6.5.16 / 2要求作业的左侧是左值

答案 1 :(得分:2)

由于C处理数组的方式,你不能分配给那样的数组。您需要单独或通过memcpy(或类似功能)复制值。例如:

for (k=0; k<5; k++){
    songs[0].i[k] = i[k];
}

或:

memcpy(songs[0].i, i, sizeof i);

请注意,memcpy要求您加入<string.h>

答案 2 :(得分:0)

您需要单独复制数组元素。主函数也应该返回一个int。

int main( void ) {
struct songs {int pitch[5], length[5];} songs[4];
int i[5]={1,22,23,14,52};
int qq, k=0;
 for( qq=0; qq<5; qq++) {
   songs[0].pitch[qq]=i[qq];      
 }
 for (k=0; k<5; k++) printf("%d\n",songs[0].pitch[k]);
return 0;
}

答案 3 :(得分:0)

C不允许您将数组复制到数组中。你必须逐个元素复制。

    struct songs {int pitch[5], length[5];} songs[4];
    int i[5]={1,22,23,14,52};
    int k=0;
    for (k=0; k<5; k++) songs[0].pitch[k] = i[k];
    for (k=0; k<5; k++) printf("%d\n",songs[0].pitch[k]);

答案 4 :(得分:0)

当您声明一个数组时,您有两个选项:

int * i;     // #1; you do this when you don`t know the size
int i[size]; // #2

您无法将数组分配给另一个数组。

正如其他人所建议的那样,你需要做的是逐个复制数组的所有元素:

    for (int j = 0; j < 5; j++) {
        songs[0].pitch[j] = i[j];
    }

请记住,使用索引运算符[]与取消引用指针相同。

甚至更多,当你说pitch[j]时,你实际上将指针j向前移动并取消引用它;就像你会说*(pitch+j)

答案 5 :(得分:0)

the following, compiles, runs, works.

notice the correction to the declaration of main
notice the addition of #include string.h to support memcpy function
notice the proper return statement at the end

and most importantly,
notice the correct method of copying an array

as a side note:
making the struct tag name and the instance name the same
is very bad programming practice

#include <stdio.h>
#include <string.h>

int main()
{
    struct songs
    {
        int pitch[5];
        int length[5];
    } songs[4];

    int i[5]={1,22,23,14,52};
    int k=0;
    memcpy( songs[0].pitch, i, sizeof( i ) );
    for (k=0; k<5; k++) 
    {
        printf("%d\n",songs[0].pitch[k]);
    } // end for

    return(0);
}

答案 6 :(得分:-1)

问题在这里,

songs[0].pitch=i;

在结构中使用int *,您不能将数组分配给另一个数组以及结构名称和结构对象。

这样可行。

struct Songs {int* pitch, length[5];} songs[4];