mysql c api 를 이용한 wrapping 라이브러리
글쓴이: idrukawa / 작성시간: 목, 2014/02/27 - 11:42오전
안녕하세요.
c api를 wrapping 해서 db 라이브러리를 만들어 보려고 합니다.
간략하게 이렇게 작성을 했는데요.
int do_connect(MYSQL *conn_out, ip, id, pw, db_name, port, sock, flag)
{
printf( "conn_out: %p\n", conn_out );
conn_out = mysql_init (NULL);
if( conn_out == NULL )
return -1;
if( mysql_real_connect(conn_out, ip, id, pw, db_name, port, sock, flag) == NULL )
return -1;
printf( "conn_out: %p\n", conn_out );
return 0;
}main에서 확인을 해보면 첫번째 인자값에 connect 포인터가 넘어오기를 기대했지만 계속 NULL로 남아있습니다.
왜그런지 알려주세요~
int main()
{
MYSQL *conn = NULL;
printf( "conn: %p\n", conn );
if( do_connect( conn, ip, id, pw, db_name, port, sock, flag) < 0 )
exit(0);
printf( "conn: %p\n", conn );
}print 결과가
첫번째는 main() 쪽에서 NULL
두번째는 do_connect() 에서 NULL
세번째는 do_connect() 에서 유효한 포인터
네번째는 main() 에서 NULL
로 찍히네요.
do_connect() 첫번째인자로 포인터를 줬는데도 값이 넘어오지 않는건 왜그런 걸까요?
Forums:


그런데 다음과 같이 return을 MYSQL * 로
그런데 다음과 같이 return을 MYSQL * 로 하면 제대로 connect 포인터가 넘어오네요.
MYSQL *do_connect (ip, id, pw, db_name, port, socket, flag) { MYSQL *conn; /* pointer to connection handler */ conn = mysql_init (NULL); /* allocate, initialize connection handler */ if (conn == NULL) return (NULL); if (mysql_real_connect (conn, ip, id, pw, db_name, port, socket, flag) == NULL) return (NULL); return (conn); /* connection is established */}main에서는
int main() { MYSQL *conn=NULL; conn = do_connect(ip, id, pw, db_name, port, socket, flag); }이런 식으로 return으로 mysql connect 포인터를 반환하면 정상적으로 넘어옵니다.
차이를 잘 모르겠네요...
d
conn = NULL;
do_connect 함수 호출 직후
conn = NULL;
conn_out = NULL;
mysql_init 함수 호출 후
conn = NULL;
conn_out = somewhere;
parameter 로 conn 포인터를 넘겨 줄 때 자신이 가르키고 있는 주소를 argument 로 넘겨 준 것이지 pointer 자신을 넘겨준 것이 아니기 때문에 conn_out 이 처음에는 conn과 같은 곳을 바라보지만 mysql_init 에서 메모리를 할당하고 그 주소 값을 넘겨 받게 되면 서로 다른 곳을 바라보게 됩니다.
conn을 변경시키기 원하면 conn의 주소를
conn을 변경시키기 원하면 conn의 주소를 넘겨주셔야죠.
댓글 달기