簡體   English   中英

將嵌套結構指針分配給嵌套結構

[英]assign a nested structure pointer to a nested structure

我有一個實體結構和另一個帶有指針的結構。 程序的目的是將實體結構分配給具有指針的結構,並使用其他結構指針訪問每個實體結構成員。

我有問題陳述:由於兩個結構成員不對稱,當我用指針將實體結構地址分配給結構時,成員指針初始化會出錯並使系統崩潰。

有沒有人有任何方法可以以優化的方式為這個問題找到解決方案?

-------------------------------------------------- - - - - - - - - - - - 程序 - - - - - - - - - - - - - - ——

#include <stdio.h>
#include <string.h>
#include <stddef.h>


/* ===================== Binding Structure ================================= */
typedef struct
{
  char id;
}tmodel;


typedef struct
{
  char id;
}tbrand;

typedef struct
{
  char id;
}tcommercialRef;

typedef struct
{
  char id;
}tserialnum;


typedef struct
{
  tmodel        *smodel;
  tbrand            *sbrand;
  tcommercialRef  *scommref;
  tserialnum      *sslnum;
}tmetadata;

typedef struct 
{
  tmetadata *smetadata;
}tlink;

typedef struct 
{
  tlink *slink;
}trefernce;

typedef struct
{
  char id[10];
  int ttl;
  int tss;
  trefernce *sref;
}telectrical;



/* ===================== Application Strucuture ==============================*/
void filldata(telectrical *elec);


typedef struct 
{        
  tmodel        smodel;
  tbrand            sbrand;
  tcommercialRef  scommref;
  tserialnum      sslnum;
}Ymetadata;

typedef struct
{
  Ymetadata smetadata; 
}slink;

typedef struct
{
  slink glink;
}refernce;

typedef struct
{
  char id[10];
  int ttl;
  int tss; 
  refernce grefernce;
}gtelectrical;


//solid strucutre object
gtelectrical obj;

//structure pointer object
telectrical  *elec = {0};

/* =============================== main.c =================================== */
int main()
{
  printf("test");

  //static void **p = (void *)&elec;

  obj.tss = 55;
  obj.ttl = 100;



  obj.grefernce.glink.smetadata.smodel.id   = 5;
  obj.grefernce.glink.smetadata.sbrand.id   = 6;
  obj.grefernce.glink.smetadata.scommref.id  = 7;
  obj.grefernce.glink.smetadata.sslnum.id    = 8;


  elec = (telectrical *)&obj;

  //elec structure -> sref pointer goes bad as it's not same type as "grefernce"

  //*p =  (void *)&obj;


  //static long x = (long) offsetof( telectrical, sref);

  //(long) offsetof(struct telectrical, sref); 

  //*(*p + x) = obj.grefernce.glink.smetadata.;


  elec->id[0] = 0;
  elec->id[1] = 1;
  elec->id[2] = 2;

  elec->ttl = 5;
  elec->tss = 10;

  elec->sref->slink->smetadata->sslnum->id = 4;
  elec->sref->slink->smetadata->sbrand->id = 1;
  elec->sref->slink->smetadata->scommref->id = 2;
  elec->sref->slink->smetadata->smodel->id = 3;

  //filldata(elec);

  printf("------");

  printf("%d\n",elec->sref->slink->smetadata->sslnum->id);
  printf("%d\n",elec->sref->slink->smetadata->sbrand->id);
  printf("%d\n",elec->sref->slink->smetadata->scommref->id);
  printf("%d\n",elec->sref->slink->smetadata->smodel->id);


  return 0;
}


/* //////////////////////////////////////// user scope ////////////////////////////// */
void filldata(telectrical *pelec)
{
  pelec->id[0] = 0;
  pelec->id[1] = 1;
  pelec->id[2] = 2;

  pelec->ttl = 5;
  pelec->tss = 10;

  //pelec->sref->slink->smetadata->sslnum->id = 4;
  //pelec->sref->slink->smetadata->sbrand->id = 1;
  //pelec->sref->slink->smetadata->scommref->id = 2;
  //pelec->sref->slink->smetadata->smodel->id = 3;

}

您沒有為指向另一個結構中存在的其他結構的指針分配內存。 這里有一些可以幫助您進行多級內存分配和分配的內容:

#include<stdio.h>
#include<stdlib.h>

typedef struct A
{
    int i;
}A_Node;

typedef struct B
{
    A_Node *A_ptr;
}B_Node;

typedef struct C
{
    B_Node *B_ptr;
}C_Node;

int main(void)
{
    //ACCESSING-MANIPULATING A USING B
    B_Node B_obj;

    B_obj.A_ptr=malloc(sizeof(*(B_obj.A_ptr)));       

    (B_obj.A_ptr)->i=192;

    A_Node A_obj=*(B_obj.A_ptr);    //For checking if the allocation is successful and good

    printf("%d\n",A_obj.i);


    //ACCESSING-MANIPULATING A USING C

    C_Node C_obj;
    C_obj.B_ptr=malloc(sizeof(*(C_obj.B_ptr)));   //allocating space for struct of B using C object

     (C_obj.B_ptr)->A_ptr = malloc(sizeof(*((C_obj.B_ptr)->A_ptr))); //allocating space for struct of A using B Struct for which space was allocated in previous step by C struct

    ((C_obj.B_ptr)->A_ptr)->i=876;

    A_obj=*((C_obj.B_ptr)->A_ptr);     //For checking if the allocation is successful and good
    printf("%d\n",A_obj.i);

    return 0;   
}

閱讀代碼並詢問是否有任何疑問,以類似的方式可以創建這個多級 struct-inside-struct (雖然它會很丑)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM