精华内容
下载资源
问答
  • 结构体数组初始化

    千次阅读 2021-03-17 15:24:52
    《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。 1、初始化 typedef struct _TEST_T { int i; char c[10]; }TEST_T; TEST...

    《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。

    1、初始化

    typedef struct _TEST_T {
    int i;
    char c[10];
    }TEST_T;

    TEST_T gst = {1, “12345”};//可以初始化,设置i为1,s为一个字符串.

    TEST_T gst = {1};//初始化个数少于实际个数时,只初始化前面的成员。

    TEST_Tgst = {.c=“12345”};//有选择的初始化成员。

    2、复合字面量。

    gst = (TEST_T){122, “1256”};//这是一个赋值语句,也可以作为初始化。可以出现在程序的任何地方。

    当然也可以使用复合字面量来初始化:

    gst = (TEST_T){.i=122, .c=“123”};

    3、结构体数组

    可以用多个大括号括起来:

    TEST_T gst[10] = {{},{},{},{}}

    也可以初始化其中的一个元素:

    TEST_T gst[10] = {[2]={}, [3]={}}

    也可以使用复合字面量:

    TEST_T gst[10] = {[2].i=0, [3].i={}}

    为什么要初始化:

    1、对局部变量初始化可以防止随机值产生的危害。

    2、对全局变量初始化可以告诉编译器,这是一个定义,而不是一个声明。(如果两个c中有相同的全局变量定义,且没有初始化,编译器会认为第二个是声明而不是定义。)

    展开全文
  • C语言结构体数组初始化 一、使用场景 在C编码中,经常需要对结构体数组进行初始化。 使用这种方法,能够使得代码更加的清晰,易读。 例如:需要根据返回码,一个status code 做不同的操作。 int process_by_status...

    C语言结构体数组初始化

    一、使用场景

    1. 在C编码中,经常需要对结构体数组进行初始化。

      使用这种方法,能够使得代码更加的清晰,易读。

      例如:需要根据返回码,一个status code 做不同的操作。

      int process_by_status_code(int status_code)
      {
          if(status_code == 180)
          {
              //do process 1
          }
          else if(status_code == 183)
          {
              //do process 2
          }
          else if(status_code == 200)
          {
              //do process 3
          }
          //........此处省略100中情况。
          return 0;
      }
      

      需要注意,使用这种方式编码,随着要处理的情况不断增多,函数必然会越来越大。而且根据《unix编程艺术》中说的,人类大脑更加的善于处理数据,而不是逻辑。

      因此可能可以换一种写法:

      typedef struct int (*status_code_process_callback)(void *param);
      typedef struct status_code_process_map
      {
          int status_code;
          status_code_process_callback fn_process;
      }status_code_process_map;
      
      status_code_process_map g_status_code_process_map_list[]=
      {
          {180,process_180},
          {183,process_183},
          {200,process_200},
          //.....此处省略N中情况。
      };
      
      int process_180(void *param)
      {
          //do 180 process
          return 0;
      }
      int process_183(void *param)
      {
          //do 183 process
          return 0;
      }
      
      
      int process_by_status_code(int status_code)
      {
          int i = 0;
          for(i = 0; i < sizeof(g_status_code_process_map_list)/sizeof(g_status_code_process_map_list[0]); i++)
          {
              if(g_status_code_process_map_list[i].fn_process)
              {
                  return g_status_code_process_map_list[i].fn_process(&status_code);
              }
          }
          return 0;
      }
      

      这样写,别人看代码,就很容易看到:

    从而更快速理解其中的隐藏逻辑。阅读代码效率更高。

    二、问题和解决

    1. 如果在映射表中需要添加参数,怎么办?

      typedef struct int (*status_code_process_callback)(void *param);
      typedef struct status_code_process_map
      {
          int status_code;
          void *param;//需要添加一个参数。
          status_code_process_callback fn_process;
      }status_code_process_map;
      
      

      那,初始化就不合理了。

      对于可能变化成员,或者变化成员顺序的初始化,需要使用这种方法:

      status_code_process_map g_status_code_process_map_list[]=
      {
          {
              .status_code = 180,
              .fn_process = process_180
          },
          {
              .status_code = 183,
              .fn_process = process_183//可以部分初始化
          },
          {
              .status_code = 200,
              .param = NULL,
              .fn_process = process_200
          }
          //.....此处省略N中情况。
      };
      
      

      使用这种方法,可以对抗成员的添加或者顺序变化。

    2. 如果某些行不想被初始化,或者不需要被初始化。或者希望提升访问的效率。怎么办?

      status_code_process_map g_status_code_process_map_list[]=
      {
          {180,process_180},
          {183,process_183},//这一行,我认为不需要出现在这里 ,但是又希望其空间是被分配的
          {200,process_200},
          //.....此处省略N中情况。
      };
      
      //这里只能使用status_code进行查找。能否直接调用呢?
      int process_by_status_code(int status_code)
      {
          int i = 0;
          for(i = 0; i < sizeof(g_status_code_process_map_list)/sizeof(g_status_code_process_map_list[0]); i++)
          {
              if(g_status_code_process_map_list[i].fn_process)
              {
                  return g_status_code_process_map_list[i].fn_process(&status_code);
              }
          }
          return 0;
      }
      

      可以使用枚举:

      enum
      {
        E_STATUS_180,
        E_STATUS_183,
        E_STATUS_200,
        //此处省略N种情况
      };
      
      status_code_process_map g_status_code_process_map_list[]=
      {
          [E_STATUS_180]{180,process_180},
          [E_STATUS_183]{183,process_183},//这一行,我认为不需要出现在这里 ,但是又希望其空间是被分配的
          [E_STATUS_200]{200,process_200},
          //.....此处省略N中情况。
      };
      

      使用这种写法,可以省略掉183的初始化,也可以使用g_status_code_process_map_list[E_STATUS_200] 直接访问对应的情况。

    三、参考

    1. 《Unix编程艺术》
    2. https://www.cnblogs.com/hansjorn/p/4693840.html
    展开全文
  • #include <string.h>///memset需要头文件<string.h>(c语言) 或 <cstring>(c++语言) struct node { int w1, w2, w3;...///结构体数组可以直接memset初始化 return 0; } ...

     

     

    
    #include <string.h>///memset需要头文件<string.h>(c语言) 或 <cstring>(c++语言)
    struct node
    {
        int w1, w2, w3;
        int number;
        double sum;
    }a[5005];
    
    int main()
    {
        memset(a, 0, sizeof(a));///结构体数组可以直接memset初始化
        return 0;
    }
    

     

    展开全文
  • 【结构体的存储】 1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。 2.结构体的每个成员相对结构体首地址的偏移量(offset)...【结构体数组要在定义时初始化。先定义再赋初值是错误的】 错误: str

    【数组初始化】

    如果定义了一个字符数组,那么它有确定的内存地址,数组名不可再次赋值;而定义一个字符指针变量时,它并未指向某个确定的字符数据,可以多次赋值

    字符指针变量:
            char* a;
            a="I love China";//或者是

            char* a="I love China";

    字符数组:
    char str[ ]="I am happy";
    注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
    char str[ ];
    str="I am happy"; //str表示字符数组的首地址值,为常量,不可赋值修改
    但在字符数组初始化时可以,即char str[14]="I love China";如果引号内字符个数大于数组长度,则按语法错误处理
    为了避免数组的越界,程序员也经常在数组名后面不加下标直接输入字符串
        char name[] = "nupt";
    不加下标的写法只能直接命名,不能像这样
        char a[];
        scanf("%s",a);

     

    【结构体的存储】

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐

    【数组的地址分配后不允许改变】
    错误:
    char str[20];
    str="I love you";/* 此处str为数组首地址,相当于常量,常量不能赋值。这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */

     

    【结构体数组要在定义时初始化。先定义再赋初值是错误的】

    错误:
    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };/* 先定义再赋初值是错误的 */


    【除了字符类型数组以外的其他类型数组,memeset非0非-1数据就会出错】

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错
    错误:
    int str[10];
    memset(str,1,sizeof(str));//这样是错误的

    memset是按字节为单位来进行赋值的,每次填充的数据长度为一个字节
    对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 
    用memset赋值时,将会对指向str地址的前40个字节进行赋值00000001(0x01) 的操作,
    一个int类型的元素有4*8=32位,赋值4次00000001(0x01)操作变为00000001000000010000000100000001(0x01010101),


    给“前10个int”的每一个int类型元素赋值0x01010101的操作,整体对应的十进制为16843009


    【定义的数组过长,而只初始化了一部分数据】

    在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,
    对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0

     

    展开全文
  • DATE: 2020.11.23 文章目录1、参考2、结构体数组初始化 1、参考 Problems Initializing Structures 2、结构体数组初始化
  • Linux GNU C结构体数组初始化示例

    千次阅读 2016-10-13 12:58:56
    GCC特有的数组初始化的风格: // 数组赋值另一种方式,但只在gcc下编译通过,g++不能 enum { AAA = 0, BBB, CCC, DDD, }; // 只对感兴趣的索引值进行赋值,而不管下标的顺序 static const int regs[] = { ...
  • 结构体数组定义时初始化

    千次阅读 2019-05-29 21:02:11
    结构体数组的初始化与前面讲的数值型数组的初始化是一模一样的,数值类型数组初始化的方法需要注意的是在结构体数组的初始化中同样适用,因为不管是不是数值型数组还是结构体数组都是数组。 #include<stdio.h>...
  • 定义嵌套结构体数组

    2017-01-21 16:29:28
    定义复杂结构体—包括嵌套结构体数组,并显示结构体所占字节数。
  • # 结构体定义 class Baz(): def __init__(self, name, place): self.name = name self.place = place ## 数组 my_foos = [] my_foos.append(Baz("foo", "Shop")) my_foos.append(Baz("bar", "Home"))
  • #include &lt;stdio.h&gt; #include &lt;math.h&gt; #define PI 3.14159265 static void math_test_acos(){ double x,ret,val; x=0.9; val=180.0/PI; ...%f 的反余弦是 %...
  • c语言结构体学习整理(结构体初始化结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来...
  • <code>struct information{ char seat_num[LEN]; int sold; char fname[LEN]; char lname[LEN]; ...struct information info[12] =...还是对12个info数组都做了初始化?</code></pre>  </p>
  • C经典 结构体数组初始化

    万次阅读 2016-05-07 21:10:31
    #include <stdio.h>int main(int argc, const char * argv[]) { //1 struct Student{ int age; char *name; }stu[3]={{22,"peter"},{33,"tom"},{23,"tiger"}}; for (int i = 0; i ;
  • 结构体定义形式三种: 1.间接定义 struct student { int num; char name[20]; }; struct student[2]; 2.直接定义 struct student { int num; char name[20]; }stu[2]; 3. 无名定义 struct { ...
  • 以PAT(A)1025 题目举例: struct every { int local; // 测试地点 int num;... // 用以不经初始化定义everystudent[30005] every(int _local, int _num, int _score) : local(_local), num(_n...
  • golang 结构体数组初始化赋值

    千次阅读 2019-09-12 12:01:38
    collArr := []*Collection{ &Collection{ ItemID: "592525", CouponID: "96f1aa53473c99", }, } 结构体使用的方法参数值 func Collec(collectr []*Collection) error {
  • python 结构体数组的正确初始化方法

    千次阅读 2020-09-22 20:28:09
    特别注意 列表=[对象]*N 这种写法是错误的,因为初始化得到的N个对象指向相同的地址,实验如下: class Phase_struct: pass #方法1 phases1 = [Phase_struct(),Phase_struct(),Phase_struct()] print(id(phases1[0]...
  • struct s_fre_phasePoint{ int start_fre; int end_fre; }; struct s_fre_phase{ s_fre_phasePoint freq_point; QVectorfreq_avr; }; #define fre_phaseNum 10...s_fre_phase fre_phase[fre_phaseNum]={ ...{{80,100},{}},
  • C++犄角旮旯之结构体数组初始化

    千次阅读 2014-10-16 13:37:42
    #include using namespace std; struct TK { char * des; int i; }; #define PROJ_HEAD(id) {#id, 1}, //#id 将id换成字符串 int main() { struct TK tks [] ={PROJ_HEAD("eac") ... cout [0].des
  • 1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdPropt[24];}; BleAndTspRmtCmd为结构体名,可以通过这个结构体名定义其他结构体变量,...
  • python实现结构体数组初始化并赋值)

    万次阅读 热门讨论 2018-10-13 16:27:40
    C语言中结构体数组概念及定义 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组。...
  • go语言结构体数组/切片声明和初始化 package main import "fmt" func main() { var s []student fmt.Printf("%T\n", s) //[]main.student fmt.Println(s) //[] //初始化结构体切片 s = []student{ { ...
  • C语言结构体数组+结构体类型指针+指向结构体数组的指针+typedef类型结构体数组两种结构体数组的定义形式用sizeof运算符求结构体数组所占字节数结构体类型指针指向结构体数组的指针typedef类型 结构体数组 如果要处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,760
精华内容 45,104
关键字:

结构体数组初始化