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 );
로 해주어야 원래의 넘겨준 변수의 주소를 따라간 주소값에 메모리가 할당되기 때문에 이때 넘겨준 인자의 주소랑 넘겨받은 주소에 할당하는 것이랑 연결이 됩니다.

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.