【问题标题】:How could I initialize a array of struct to null?如何将结构数组初始化为空?
【发布时间】:2014-04-23 08:08:59
【问题描述】:
    typedef struct 
    {
        char*title;
        int year;
        int length; //in minutes
    } record;

    record list[1024];
    int j;
    for(j=0;j<1024;++j)
        list[j]=NULL;

我正在尝试初始化一个结构数组并让每个元素最初都指向 null,而 gcc 给我一个错误“从类型 'void* 分配给类型 'record' 时类型不兼容”。我该如何解决?这样做的目的是当我访问一个元素时,我能够查看它是否有数据或只是空的。

【问题讨论】:

  • 人们经常使用memset(list, '\0', sizeof(list));
  • 您的数组不是指向records 的指针数组,而是record 值的数组。您不能将数组的元素设置为NULL,因为它们不是指针。这不是 java...
  • 你说的太对了!非常感谢。
  • 我想要一个指针数组而不是 struct..谢谢。

标签: c arrays pointers struct


【解决方案1】:

您可以通过这种方式在声明时初始化您的数组:

record list[1024] = {{0}};

【讨论】:

  • 如何检查此块中是否没有元素?例如 list[2] 为空,我应该使用 if(list[2]==0) 吗?
  • 您可以使用title 成员作为标记来表示元素尚未初始化:if (list[2].title == NULL)
  • @Robin:当您分配一个包含 1024 个条目的数组时,所有 1024 个条目都已分配,存在。可以使用list[2].title == 0(或者list[2].title == NULL)来测试是否有名字,但是空间是分配的。
  • @ouah:我没有投反对票,但是投反对票的人可能认为你没有真正回答这个问题。没有空结构之类的东西,除非按照惯例。带有title==NULLyear==0length==0record 对象可能是有效记录。
【解决方案2】:

list[1024]; 是你的结构的对象数组,你可以像

一样访问它
list[j].title;
list[j].year;
list[j].length; 

你正在做的是:

list[j]=NULL

list[j]record 类型,NULL 是 void*。我想这不是你的想法。

要么通过单独访问它们来初始化结构中的各个元素,要么按照其他人的建议使用memset

【讨论】:

    【解决方案3】:

    如果你想在 for 循环中一次做一个,它看起来像这样

    for(j=0;j<1024;++j)
        list[j]=(record){0,0,0};
    

    我建议使用memset(list,0,1024*sizeof(record))

    bzero(list, 1024*sizeof(record))

    如果你想用指针来做,那么你可以像这样声明你的数组:

    record * list[1024];
    

    然后,您可以像现在一样将每个设置为 NULL,并在准备好时对每个进行 malloc。

    【讨论】:

    • 您可能应该提到(record){0,0,0} 是一个C99 复合文字,尤其是因为它可能不受MSVC 支持。是否有充分的理由使用1024 * sizeof(record) 而不仅仅是sizeof(list),如果list 的尺寸从1024 更改为其他数字,它将自动更改为正确的大小?
    • @JonathanLeffler,我想不出什么理由不使用sizeof(list),这不是我所熟悉的。我会为RECORDS_IN_LIST 定义一个宏最舒服,因为如果我的代码中有一个没有名字的数字,我总是会感到难过。然后我会得到RECORDS_IN_LIST*sizeof(record),我觉得它非常易读。
    • 如果考虑性能,1 个大型分配将比 1024 个小型分配花费更少的时间。
    【解决方案4】:

    您的数组不是指向records 的指针数组,而是record 值的数组。您不能将数组的元素设置为NULL,因为它们不是指针。这不是java...

    【讨论】:

      【解决方案5】:

      我的 C 有点生锈了,但我相信你想要这个:

      record list[1024];
      
      memset((char*)list, '\0', sizeof(record) * sizeof(list));
      

      因为 sizeof(an array) 返回数组中元素的数量,而不是数组的字节大小。

      【讨论】:

      • 您不需要将sizeof(list) 乘以sizeof(record),因为sizeof(list) 是整个列表的字节大小。这会踩踏很远的距离,导致崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多