2차원구조체 배열을 포인터로 사용하기...동적으로 할당되기 때

shean0의 이미지

내용은 간단합니다.
struct[]를 malloc으로 잡고 포인터를 넘겨서..P_Node에 값을 채웁니다. => 동작하구요.
==>struct [][]를 malloc으로 잡고 포인터를 넘겨서... P_Vertex 을 채웁니다.. <== 여기가 이상해서요..
구조체 이중 포인트인데...왜 안되는지...
어디가 틀린것인지..보이지가 않네요...헉헉...
pP_Vertex[][] 이런구조를 만들어야지..나중에 작업이 쉬어질것으로 보이거든요..
구조체 이중배열을 만든다는 애기인데..어디가 오류인지....
부탁을 드립니다.... 안보여요... gggg...ㅠㅠ

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Protocl_720_Info
{
    char   Query_type;
    int    stNodeID;
    int    link_count;
    unsigned int    ed_gpsX;
    unsigned int    ed_gpsY;
    char   ed_node_name[30];
};
struct Protocl_720_Node
{
    int   stNodeID;
    int   vertex_count;
};
struct Protocl_720_Vertex
{
    int gpsX;
    int gpsY;
    int angle;
};      
/**************************************************
함수명: get_vertex_info
목적  : pP_720_Vertex[node_count 또는 link_count][vertex_count] 구조에 필드 채우기 .
                                            ------------- P_720_Node.vertex_count 값이다.
		             ----------------------- -------------동적으로 변한다..
입력  : P_720_Node.idx ,link_count
리턴  : 1, error -1;
호출  : make_700
***************************************************/
unsigned int get_vertex_info(struct Protocl_720_Node *P_Node,struct Protocl_720_Vertex **pP_Vertex,int link_count);

int main()
{ 
     int ret; 
     int max_vertex_count=3;
     int link_count=4;
     struct Protocl_720_Node *P_720_Node;
     struct Protocl_720_Vertex **pP_720_Vertex;

      P_720_Node=(struct Protocl_720_Node *)malloc( sizeof(struct Protocl_720_Node)*link_count );
     if(  (P_720_Node==0) )
     {
          printf("Memory Malloc 실패 \n"); return -1;
     }
     memset(P_720_Node,0x0,sizeof(struct Protocl_720_Node)*link_count);
/**** 이부분이 ...********/
/*    pP_720_Vertex[0]=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*max_vertex_count*link_count ) ; */
  	 *pP_720_Vertex=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*link_count ) ; 
     for(int i=0; i<link_count; i++)
     {
		 pP_720_Vertex[i]=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*max_vertex_count ) ; 
         if(pP_720_Vertex[i] == 0)
		 {
			 printf("Memory Malloc 실패 \n"); return -1;
		 }
		 else
		    memset( pP_720_Vertex[i],0x0,sizeof(struct Protocl_720_Vertex)*max_vertex_count);
	 }
	 ret=sizeof(struct Protocl_720_Vertex)*link_count*max_vertex_count;
     printf("print for pP_720_Vertex size==>[%d]: \n",ret);

	 ret = get_vertex_info(P_720_Node,pP_720_Vertex,link_count);
  
	 if( ret < 1)
     {
         printf("get vertex_Info Error\n"); return -1;
     }
     printf("ending\n"); 
      return 1;
}



unsigned int get_vertex_info(struct Protocl_720_Node *P_Node,struct Protocl_720_Vertex **pP_Vertex,int link_count)
{
      int i,j=1;
     for(i=0;i<link_count;i++)
      {
             P_Node[i].stNodeID=i*10+j;
      }
      for(i=0;i<link_count;i++)
      {
             printf("i[%d] [%d]\n",i,P_Node[i].stNodeID);
      }
	  
	  for(i=0;i<link_count;i++)
      {
          for(j=0;j<3;j++)
          {
             pP_Vertex[i][j].angle=i*10+j;
          }
      }
      for(i=0;i<link_count;i++)
      {
          for(j=0;j<3;j++)
          {
             printf("ij[%d][%d] [%d]\n",i,j,pP_Vertex[i][j].angle);
          }
      }

  return 1;
}
iyouhe의 이미지

man에서 보면 malloc()은
void *malloc(size_t size);
로 되어 있습니다.
반환값이 포인터 입니다. 이중 포인터가 아니기 때문에 이중포인터 변수에는 대입할 수 없습니다.

그리고 배열로 표현시에는 calloc()이 좋지 않나요?

void *calloc(size_t nmemb, size_t size);

nmemb = 배열 수
size = 데이터 사이즈

배울수 있어서 좋다.

shean0의 이미지

struct Protocl_720_Vertex **) 를 하면 에러..

     struct Protocl_720_Vertex *) 를 하면 익셉션..

=======> 아래와 같이 수정하니 되네요.. 

    struct Protocl_720_Vertex **pP_720_Vertex;

     pP_720_Vertex=(struct Protocl_720_Vertex **)malloc( sizeof(struct Protocl_720_Vertex)*link_count ) ; 

    //*pP <==fault <=================여기서 문제가 있었구요.

    //내부적으로 각각 malloc하는것을 생각하지못한것이 원인이네요.. 이 소스가 모두에게 도움이 되기를..^^*

     for(int i=0; i<link_count; i++)

     {

         pP_720_Vertex[i]=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*max_vertex_count ) ; 

         if(pP_720_Vertex[i] == 0)

         {

             printf("Memory Malloc 실패 \n"); return -1;

         }

         else

            memset( pP_720_Vertex[i],0x0,sizeof(struct Protocl_720_Vertex)*max_vertex_count);

     }

     ret=sizeof(struct Protocl_720_Vertex)*link_count*max_vertex_count;

     printf("print for pP_720_Vertex size==>[%d]: \n",ret);


=====>totoal source 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct Protocl_720_Info

{

    char   Query_type;

    int    stNodeID;

    int    link_count;

    unsigned int    ed_gpsX;

    unsigned int    ed_gpsY;

    char   ed_node_name[30];

};

struct Protocl_720_Node

{

    int   stNodeID;

    int   vertex_count;

};

struct Protocl_720_Vertex

{

    int gpsX;

    int gpsY;

    int angle;

};      

/**************************************************

함수명: get_vertex_info

목적  : pP_720_Vertex[node_count 또는 link_count][vertex_count] 구조에 필드 채우기 .

                                            ------------- P_720_Node.vertex_count 값이다.

                     ----------------------- -------------동적으로 변한다..

입력  : P_720_Node.idx ,link_count

리턴  : 1, error -1;

호출  : make_700

***************************************************/

unsigned int get_vertex_info(struct Protocl_720_Node *P_Node,struct Protocl_720_Vertex **pP_Vertex,int link_count);

 

int main()

{ 

     int ret; 

     int max_vertex_count=3;

     int link_count=4;

     struct Protocl_720_Node *P_720_Node;

     struct Protocl_720_Vertex **pP_720_Vertex;

 

      P_720_Node=(struct Protocl_720_Node *)malloc( sizeof(struct Protocl_720_Node)*link_count );

     if(  (P_720_Node==0) )

     {

          printf("Memory Malloc 실패 \n"); return -1;

     }

     memset(P_720_Node,0x0,sizeof(struct Protocl_720_Node)*link_count);

 

/*    pP_720_Vertex[0]=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*max_vertex_count*link_count ) ; */

     pP_720_Vertex=(struct Protocl_720_Vertex **)malloc( sizeof(struct Protocl_720_Vertex)*link_count ) ; 

     for(int i=0; i<link_count; i++)

     {

         pP_720_Vertex[i]=(struct Protocl_720_Vertex *)malloc( sizeof(struct Protocl_720_Vertex)*max_vertex_count ) ; 

         if(pP_720_Vertex[i] == 0)

         {

             printf("Memory Malloc 실패 \n"); return -1;

         }

         else

            memset( pP_720_Vertex[i],0x0,sizeof(struct Protocl_720_Vertex)*max_vertex_count);

     }

     ret=sizeof(struct Protocl_720_Vertex)*link_count*max_vertex_count;

     printf("print for pP_720_Vertex size==>[%d]: \n",ret);

 

     ret = get_vertex_info(P_720_Node,pP_720_Vertex,link_count);

  

     if( ret < 1)

     {

         printf("get vertex_Info Error\n"); return -1;

     }

     printf("ending\n"); 

      return 1;

}

 

 

 

unsigned int get_vertex_info(struct Protocl_720_Node *P_Node,struct Protocl_720_Vertex **pP_Vertex,int link_count)

{

      int i,j=1;

     for(i=0;i<link_count;i++)

      {

             P_Node[i].stNodeID=i*10+j;

      }

      for(i=0;i<link_count;i++)

      {

             printf("i[%d] [%d]\n",i,P_Node[i].stNodeID);

      }

      

      for(i=0;i<link_count;i++)

      {

          for(j=0;j<3;j++)

          {

             pP_Vertex[i][j].angle=i*10+j;

          }

      }

      for(i=0;i<link_count;i++)

      {

          for(j=0;j<3;j++)

          {

             printf("[%d]   ",pP_Vertex[i][j].angle);

          }

          printf("\n");

      }

 

  return 1;

}

언제나 즐프를 꿈꾸며~

shean0의 이미지

^^*

for(int i=0; <== 에구..포인터 에러 잡느라.... 윈도에서 작업했더니..

언제나 즐프를 꿈꾸며~

new5244의 이미지

주소가 저장될 공간만 할당해 주면 될 것 같은데요....

pP_720_Vertex=(struct Protocl_720_Vertex **)malloc( sizeof(struct Protocl_720_Vertex)*link_count ) ;

====>

pP_720_Vertex=(struct Protocl_720_Vertex **)malloc( sizeof(struct Protocl_720_Vertex *)*link_count ) ;

sizeof (struct Protocl_720_Vertex *)

from saibi

고물의 이미지

P_720_Node=(struct Protocl_720_Node *)malloc( sizeof(struct Protocl_720_Node)*link_count );

이 부분이 있는데..

포인터 값으로 넘겨받은 주고가 P_720_Node에 들어가는데..

넘겨받은 값 대신에 메모리를 할당잡아서 P_720_Node에 그 주소값을 넣으면

원래 받았던 주소의 값이 무시 되기 때문에

넘겨 줄때의 주소랑 넘겨 받아서 메모리 할당받은 주소랑 틀리게 됩니다.

이렇기 때문에 무의미 합니다.

P_720_Node값을 함수의 인자로 넘겨 받을때 2point로 받아서
**P_720_node (물론 줄때 &로 생성인자의 주소값을 포함한 2point 입니다)

그리고 *P_720_node==(struct Protocl_720_Node *)malloc( sizeof(struct Protocl_720_Node)*link_count );
로 해주어야 원래의 넘겨준 변수의 주소를 따라간 주소값에 메모리가 할당되기 때문에 이때 넘겨준 인자의 주소랑 넘겨받은 주소에 할당하는 것이랑 연결이 됩니다.

이전 코드는 연결이 안되기 때문에 무의미한 코드입니다.