2차원구조체 배열을 포인터로 사용하기...동적으로 할당되기 때
글쓴이: shean0 / 작성시간: 금, 2003/02/21 - 2:34오후
내용은 간단합니다.
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;
}Forums:


man에서 보면 malloc()은 void *malloc(size_t
man에서 보면 malloc()은
void *malloc(size_t size);
로 되어 있습니다.
반환값이 포인터 입니다. 이중 포인터가 아니기 때문에 이중포인터 변수에는 대입할 수 없습니다.
그리고 배열로 표현시에는 calloc()이 좋지 않나요?
void *calloc(size_t nmemb, size_t size);
nmemb = 배열 수
size = 데이터 사이즈
배울수 있어서 좋다.
[자답]아래처럼해서 해결했습니다..참조하세요 ^^*
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; }언제나 즐프를 꿈꾸며~
calloc 라..감사합니다..[냉무]
^^*
for(int i=0; <== 에구..포인터 에러 잡느라.... 윈도에서 작업했더니..
언제나 즐프를 꿈꾸며~
흠....
주소가 저장될 공간만 할당해 주면 될 것 같은데요....
sizeof (struct Protocl_720_Vertex *)
from saibi
P_720_Node=(struct Protocl_720_Node *)ma
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 );
로 해주어야 원래의 넘겨준 변수의 주소를 따라간 주소값에 메모리가 할당되기 때문에 이때 넘겨준 인자의 주소랑 넘겨받은 주소에 할당하는 것이랑 연결이 됩니다.
이전 코드는 연결이 안되기 때문에 무의미한 코드입니다.
댓글 달기