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 포인터가 넘어오네요.
main에서는
이런 식으로 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의 주소를 넘겨주셔야죠.
댓글 달기