如何初始化结构内部的指向NULL的指针数组,并且该结构位于其他结构的数组中

时间:2019-05-25 15:17:51

标签: c

所以我有一个结构,里面有一个指针数组(指向另一个结构)。 我试图将该数组初始化为NULL,但看来您无法在C中完成此操作。 您如何将数组Rpr初始化为NULL?

我试图用另一种方式来做,就像您在下面的代码中看到的那样,但是它不起作用。

typedef struct {maillon *Rpr [7];} repere;
repere R[26];

for(int i=0;i<26;i++){
   R[i].Rpr={NULL};
}

它会弹出一些随机的无关紧要的错误。

4 个答案:

答案 0 :(得分:3)

C在赋值(这是一个表达式)和初始化(这是变量的定义的一部分)之间进行区分。特别是= { ... }语法仅对初始化有效。

如果要使用一个单独的循环执行此操作,则需要两个嵌套循环(或许多重复的代码来设置所有元素):

for (int i=0; i<26; i++) {
    for (int j = 0; j<7; j++) {
        R[i].Rpr[j] = NULL;
    }
}

或者,只需使用初始化:

repere R[26] = { { { NULL } } };

从技术上讲,这仅在外部数组的第一个元素中的结构中初始化内部数组的第一个元素,但是C没有“半初始化”变量。规则是,如果有一个初始化程序未覆盖变量的所有字段,则将它们隐式设置为零。对于指针,这意味着它们都是空指针。

实际上,可以使“用0初始化所有内容”初始化程序变得更短,更通用:

repere R[26] = { 0 };

{ 0 }初始化程序也适用于其他类型。 (一些编译器对此构造发出警告(“ 在初始化程序中缺少大括号”和类似内容。这些编译器很愚蠢,需要停止。)

答案 1 :(得分:1)

您将必须执行以下操作:

for(int i=0;i<26;i++){
    for(int j=0; j<7; j++)
       R[i].Rpr[j]=NULL;
}

但是您可以通过编写repere R[26]={0};来完全跳过循环,这将使结构的整个内存初始化为零,而不管存在多少个字段或它们是什么类型。

答案 2 :(得分:1)

一种简单的方法

   memset(R, 0, sizeof(R));

答案 3 :(得分:0)

正如其他人指出的,这里

maillon *Rpr [7];

Rprmaillon类型的指针的指针数组,您需要使用NULL初始化每个指针。对于例如

for (int i=0; i<26; i++) {
    for (int j = 0; j<7; j++) { /* Rpr is array of 7 pointers, so rotate 7 times */
        R[i].Rpr[j] = NULL; /* initializing each Rpr[index] with NULL */
    }
}