结构体变量的初始化及赋值

时间:2021-09-23 19:47:40
编译环境为C-Free 5.0专业版

#include <stdio.h>
 main()
{
struct list
{
int number;
char name;
}list2;
list2={3,'D'};
printf("%c\n",list2.name);

}
=========================
这里面的list2={3,'D'};这句提示错误。问了问也没找到解决办法,发帖问问吧。


当然我可以这样写:
#include <stdio.h>
 main()
{
struct list
{
int number;
char name;
}list2={3,'D'};
printf("%c\n",list2.name);

}
或者
#include <stdio.h>
 main()
{
struct list
{
int number;
char name;
};
        
        struct list  list2={3,'D'};
printf("%c\n",list2.name);

}

这两种写法都没错。但为什么刚开始的那种写法提示错误呢?
错误的代码为:

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 C:\Users\cike\Desktop\testing\jiegouti\jiegouti.cpp...
[Error] C:\Users\cike\Desktop\testing\jiegouti\jiegouti.cpp:13: error: expected primary-expression before '{' token
[Error] C:\Users\cike\Desktop\testing\jiegouti\jiegouti.cpp:13: error: expected `;' before '{' token

构建中止 jiegouti: 2 个错误, 0 个警告




8 个解决方案

#1


初始化怎么会是{}呢?

#2


引用 1 楼 afterseptember 的回复:
初始化怎么会是{}呢?


你指的是哪一个?

#3


这样写是可以的:

#include <stdio.h>

int main(int argc, char** argv)
{
typedef struct LIST
{
int number;
char name;
}AList;

AList LIST2 = {3,'D'};
printf("%c\n",LIST2.name);
}


这样写也是可以的:

#include <stdio.h>

int main(int argc, char** argv)
{
struct LIST
{
int number;
char name;
}LIST2 = {3,'D'};
printf("%c\n",LIST2.name);
}

#4


总结一下:

struct LIST list1 = {3, 'D'};   // OK
// 但是下面这样就不行:
struct LIST list2;
list2 = {3, 'D'};

// 这个和数组初始化时一回事情,比如:
char a[2] = {'A', 'B'}; // OK

char b[2];
b = {'A', 'B'}; // NOT OK!!!

#5


引用 4 楼 pathuang68 的回复:
总结一下:
C/C++ code

struct LIST list1 = {3, 'D'};   // OK
// 但是下面这样就不行:
struct LIST list2;
list2 = {3, 'D'};

// 这个和数组初始化时一回事情,比如:
char a[2] = {'A', 'B'};        // OK

char b[2];
b = {'A', 'B'};    ……


这个意思就是说,声明的时候直接初始化的时候是可以的
但是,不和声明一起,就是赋值,而C是只能单变量赋值的

#6


结构体数组 开始声明的时候初始化可以整体赋值
例如 a[3]={3,4,5}; 
如果你写成 int a[3];
             a[3]={3,4,5}这就错了 ,编译器会找不到a[3];
结构体也一样只有在声明定义结构体的时候可以整体赋值,其他时候只能单个赋值了
你上面那个 改成
struct list

   int number;
   char name;

}list2;
list2.name = ‘d’;
list2.number = 3;

还有一般定义一个结构体类型的时候还不要起名字好点,功能单独开 代码看起来比较明朗

#7


该回复于2011-11-03 18:25:49被版主删除

#8


我觉得应该是结构体和数组是一样的道理。数组名和结构体变量名代表的是该数组或者结构体的首地址,是一个确定的唯一地址,由系统分配。在定义以后初始化其实是将几个常量分配给这个唯一的首地址里,这是不能实现的,所以系统报错。而在定义的时候直接初始化,那时候的“=”代表的并不是赋值的意思,而是代表初始化。

#1


初始化怎么会是{}呢?

#2


引用 1 楼 afterseptember 的回复:
初始化怎么会是{}呢?


你指的是哪一个?

#3


这样写是可以的:

#include <stdio.h>

int main(int argc, char** argv)
{
typedef struct LIST
{
int number;
char name;
}AList;

AList LIST2 = {3,'D'};
printf("%c\n",LIST2.name);
}


这样写也是可以的:

#include <stdio.h>

int main(int argc, char** argv)
{
struct LIST
{
int number;
char name;
}LIST2 = {3,'D'};
printf("%c\n",LIST2.name);
}

#4


总结一下:

struct LIST list1 = {3, 'D'};   // OK
// 但是下面这样就不行:
struct LIST list2;
list2 = {3, 'D'};

// 这个和数组初始化时一回事情,比如:
char a[2] = {'A', 'B'}; // OK

char b[2];
b = {'A', 'B'}; // NOT OK!!!

#5


引用 4 楼 pathuang68 的回复:
总结一下:
C/C++ code

struct LIST list1 = {3, 'D'};   // OK
// 但是下面这样就不行:
struct LIST list2;
list2 = {3, 'D'};

// 这个和数组初始化时一回事情,比如:
char a[2] = {'A', 'B'};        // OK

char b[2];
b = {'A', 'B'};    ……


这个意思就是说,声明的时候直接初始化的时候是可以的
但是,不和声明一起,就是赋值,而C是只能单变量赋值的

#6


结构体数组 开始声明的时候初始化可以整体赋值
例如 a[3]={3,4,5}; 
如果你写成 int a[3];
             a[3]={3,4,5}这就错了 ,编译器会找不到a[3];
结构体也一样只有在声明定义结构体的时候可以整体赋值,其他时候只能单个赋值了
你上面那个 改成
struct list

   int number;
   char name;

}list2;
list2.name = ‘d’;
list2.number = 3;

还有一般定义一个结构体类型的时候还不要起名字好点,功能单独开 代码看起来比较明朗

#7


该回复于2011-11-03 18:25:49被版主删除

#8


我觉得应该是结构体和数组是一样的道理。数组名和结构体变量名代表的是该数组或者结构体的首地址,是一个确定的唯一地址,由系统分配。在定义以后初始化其实是将几个常量分配给这个唯一的首地址里,这是不能实现的,所以系统报错。而在定义的时候直接初始化,那时候的“=”代表的并不是赋值的意思,而是代表初始化。