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 = 데이터 사이즈
배울수 있어서 좋다.
[자답]아래처럼해서 해결했습니다..참조하세요 ^^*
언제나 즐프를 꿈꾸며~
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 );
로 해주어야 원래의 넘겨준 변수의 주소를 따라간 주소값에 메모리가 할당되기 때문에 이때 넘겨준 인자의 주소랑 넘겨받은 주소에 할당하는 것이랑 연결이 됩니다.
이전 코드는 연결이 안되기 때문에 무의미한 코드입니다.
댓글 달기