【问题标题】:C (not ++) a struct of struct array in struct dynamic initialization troubles mallocC(不是++)结构中的结构数组结构动态初始化麻烦malloc
【发布时间】:2013-12-10 00:55:45
【问题描述】:

我在初始化数组中结构的(动态)部分时遇到了一些小问题。这就是我到目前为止所拥有的,我正在使用子例程来创建结构

t_grille_animaux creer_grille(int dim_ligne, int dim_col) 
{
    t_grille_animaux grille;

    grille.la_grille = (t_case_animal **) malloc(sizeof(t_case_animal)*dim_ligne*dim_col);

    grille.dim_colonne = dim_col;

    grille.dim_ligne = dim_ligne;

    grille.nb_predateurs = NULL;

    grille.nb_proies = NULL;

    return grille;

}

这是我的结构:

typedef struct
{
    t_case_animal ** la_grille; //2D array
    int dim_ligne;
    int dim_colonne;
    int nb_proies;
    int nb_predateurs;
} t_grille_animaux;

typedef struct
{
    t_contenu etat;
    t_animal animal;
} t_case_animal;

typedef enum {VIDE, PROIE, PREDATEUR} t_contenu;

typedef struct
{ 
    int age;           
    int jrs_gestation; 
    int energie;      
    int disponible;    
} t_animal;

(对不起语言)

我现在得到的是数组中不是结构的所有内容都很好。但是数组中的所有内容都未声明。

【问题讨论】:

  • 标签本身就可以阐明语言。无需在标题中指定它(并浪费空间来命名您的问题:))
  • la_grille 是指向t_case_animal 的指针数组。您将其分配为t_case_animal 的数组

标签: c arrays struct


【解决方案1】:

这应该可以解决问题:

#define NUM_ROWS (10)
#define NUM_COLS (15)

grille.la_grille = malloc(NUM_ROWS * sizeof(*grille.la_grille));
for(int row = 0; row < NUM_ROWS; row++)
    grille.la_grille[row] = malloc(NUM_COLS * sizeof(**grille.la_grille));

【讨论】:

  • @user3084993 不要担心会出错。多年来我一直在使用指针,但我仍然总是出错!
【解决方案2】:

malloc() 函数不会(必然)将分配的字节初始化为任何特定的值。所以调用malloc()之后,应该显式初始化分配的数据。

话虽如此,关于如何存储二维数组,您有几个选择。这取决于您希望如何访问数据。由于 C 没有真正的多维数组,您可以:

  • 声明大小为dim_ligne*dim_colt_case_animal 值的一维数组
  • 声明一个大小为dim_ligne的行指针数组,每个指针指向另一个dim_col值的一维数组

对于第一种情况,将la_grille 的声明更改为:

t_case_animal * la_grille;

并以la_grille[j*dim_colonne+i] 之类的形式访问您的值。

对于第二种情况,一定要初始化你的子数组:

grille.la_grille = (t_case_animal **) malloc(sizeof(t_case_animal*)*dim_ligne);
for (int i = 0; i < dim_ligne; i++) {
    grille.la_grille[i] = (t_case_animal *) malloc(sizeof(t_case_animal)*dim_col);
}

在第二种情况下,您可以像la_grille[j][i] 一样访问您的值。

【讨论】:

    【解决方案3】:

    您可以使用malloc() 为每一行分配内存。以下代码应该可以工作:

    #include<stdlib.h>
    
    typedef struct
    { 
        int age;           
        int jrs_gestation; 
        int energie;      
        int disponible;    
    }t_animal;
    
    typedef enum {VIDE, PROIE, PREDATEUR} t_contenu;
    
    typedef struct
    {
        t_contenu etat;
        t_animal animal;
    } t_case_animal;
    
     typedef struct
    {
        t_case_animal ** la_grille; //2D array
        int dim_ligne;
        int dim_colonne;
        int nb_proies;
        int nb_predateurs;
    } t_grille_animaux;
    
    
    t_grille_animaux creer_grille(int dim_ligne,int dim_col)
    {
    
    t_grille_animaux grille;
    
    
        grille.la_grille = (t_case_animal**) malloc(sizeof(t_case_animal*)*dim_ligne);
    
        for(int i=0; i<dim_ligne; i++) {
            grille.la_grille[i] = (t_case_animal*) malloc(sizeof(t_case_animal)*dim_col);
        }
    
    grille.dim_colonne = dim_col;
    
    grille.dim_ligne = dim_ligne;
    
    grille.nb_predateurs = 0;
    
    grille.nb_proies = 0;
    
    return grille;
    
    }
    
    int main(int argc, char* argv[])
    {
        t_grille_animaux test;
        test = creer_grille(3, 4);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2012-05-02
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多