如何在C中的结构数组中将所有值设置为NULL结构数组

时间:2014-04-26 06:50:03

标签: c arrays pointers struct

基本上我有两个结构,我想创建一个A结构数组,并且在每个A结构中我想要一个包含50个B结构的数组。所以我假设我们将使用双指针。

struct A{
    char* a_word;
    struct B** b_list;
};

struct B{
   char* b_word;
   int b_value;
};

当调用initialize函数时,我会像这样初始化结构。我的目标是在分配内存时将所有值设置为NULL。

struct Word** initialize()
{
    int k;
    int i; 
    struct A** A_list = calloc(BUFFSIZE, sizeof(struct A*));
    for(k =0; k < BUFFSIZE; k++)
    {
     A_list[k] =  calloc (1, sizeof(struct A)); 
     A_list[k]-> b_list =  calloc(50, sizeof(struct B*));

        for(i = 0; i < 50; i++)
        {
           A_list[k]->b_list[i] =  calloc(1, sizeof(struct B)); 
        }

      }
return hashTable;
} 

初始化所有这些值后,我能够做到。 。

if(A[43]->a_word == NULL) //43 unallocated value
  {
    printf("This is null\n");
    //program prints this statement - good
    //program knows that this value is NULL
  }

但我也想要。

if(A_list[44]->b_list[0] == NULL)
{
   printf("This is also null");
   //This should be printed but nothing happens
}

出于某种原因无关紧要,如果我将上述if语句设置为== NULL!= NULL,程序将完全不输出该if语句。内存中发生了什么以及如何正确分配所有内容,因此默认情况下将值设置为NULL,因此我可以输入值?

编辑:无论何时尝试A_list[value1]->b_list[value2] = strdup("string");我都会遇到分段错误,这很可能源于同样的问题。

1 个答案:

答案 0 :(得分:4)

正如 WhozCraig 在对该问题的评论中所提到的,此代码

    for(i = 0; i < 50; i++)
    {
       A_list[k]->b_list[i] =  calloc(1, sizeof(struct B)); 

初始化b_list的前50个元素以指向有效内存,即非0,假设calloc()永不失败。乐观的你最好测试那些!= NULL的元素。

  

...如果我将上述if语句设置为== NULL或!= NULL,程序绝对不输出任何内容

代码似乎没有在此处刷新stdout

if(A_list[44]->b_list[0] == NULL)  
{
   printf("This is also null");

通过添加最终\n

来更改此设置
if(A_list[44]->b_list[0] != NULL)  
{
   printf("This isn't null\n");

默认情况下,stdout是行缓冲的,如果检测到新行,则会刷新所有内容。