结构体数组的赋值

3
我有一个结构体数组。我想要做的是给这些结构体成员赋值。以下代码有什么问题...
#include <stdio.h>


typedef struct{
int a1;
int a2;

}sample;


main(){

sample ar[4]={ 
    (1,2),
    (3,4),
    (5,6),
    (7,8) 
};

int i;
for(i=0;i<4;i++){
    printf("ar[%d]----%d  %d",i,ar[i].a1,ar[i].a2);
     }
}

现在编译成功了,但输出为空。
ar[0]----2  4 
ar[1]----6  8 
ar[2]----0  0 
ar[3]----0  0 

也许程序是正确的,而我只是有一个愚蠢的误解,或者可以尝试以下方法:

ar[0]----1  2
ar[1]----3  4 
ar[2]----5  6 
ar[3]----7  8

在答案进行更正后,您将获得正确的结果。对于新问题,请展示您的完整代码。是的,在printf中添加\n以换行。 - Grijesh Chauhan
在赋值操作中应该使用第二种括号(例如{...})。我之前一直使用第一种括号(例如(...))。 - manmatha.roy
内核狂人很棒 :) - Grijesh Chauhan
3个回答

2

你已经写了:

sample ar[4];
ar[4] = { 
    (1,2),
    (3,4),
    (5,6),
    (7,8) 
};

数组初始化器的语法(仅在ar初始化期间有效)如下:

sample ar[4] = { 
    {1,2},
    {3,4},
    {5,6},
    {7,8} 
};

C11 (n1570), § 6.7.9 Initialization

initializer:   
    assignment-expression 
    { initializer-list } 
    { initializer-list , }
此外,缩进 对于编写可读代码也非常重要。

是的,赋值操作成功了。但是 printf 语句的输出结果是错误的。我会编辑我的帖子。 - manmatha.roy
@kernelmaniac:我已经在我的电脑上测试过了,它似乎可以工作。你期望得到什么,又得到了什么? - md5
我期望的是在我的编辑中指定的,请查看。也许我正在遭受一个愚蠢的误解。 - manmatha.roy

2
您应该以这种方式初始化您的向量:
sample ar[4] = {
    {1,2},
    {3,4},
    {5,6},
    {7,8}
};

此外,您应该指定main()的返回类型:
       int main()
    // ^^^
    // ...

隐式声明意味着编译器不知道该函数的存在,但相信您知道如何使用它。-Werror 将隐式声明视为错误而非警告。 - David
@xavier: 不过这并不适用于C++。虽然问题标记既有C又有C++,但我会编辑答案以澄清这一点。 - Andy Prowl
@DavidCzihak:Xavier 的意思与此不同(这在 C 中可能是可能的,但我不确定,在 C++ 中不行)。 - Andy Prowl
main 函数的有效定义在 C 和 C++ 中都是 int main()。没有返回类型的函数默认为 int,但这已经是很久以前的 c89 标准了,现在不再适用。 - Alok Save
至少使用int main(int argc, char** argv)作为头文件是一个好的实践,因为它在大多数平台和C编译器上都存在。 - David
显示剩余9条评论

0

你应该在声明时进行赋值,并始终使用“{”。

sample ar[4] = { 
    {1,2},
    {3,4},
    {5,6},
    {7,8} 
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接