基本上我有两个结构,我想创建一个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");
我都会遇到分段错误,这很可能源于同样的问题。
答案 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
是行缓冲的,如果检测到新行,则会刷新所有内容。