2013-08-29 2 views
0

MySQL 쿼리에서 가져온 결과를 구조체 배열에 저장하려고합니다. 유형을 제대로 작동시키지 못했고, MySQL 문서를 분류하기가 어려웠습니다.C MySQL 형식 오류

struct login_session 
{ 
    char* user[10]; 
    time_t time; 
    int length; 
}; 

그리고 데이터를 얻기 위해 노력하고있어 루프는 없다 :

내 구조체이다

while ((row = mysql_fetch_row(res)) != NULL) { 
    strcpy(records[cnt].user, &row[0]); 
    cnt++; 
} 

아무리 지속적으로 오류가 내가 그래도 시도 :

test.c:45: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type 
/usr/include/string.h:128: note: expected ‘char * __restrict__’ but argument is of type ‘char **’ 
test.c:45: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type 
/usr/include/string.h:128: note: expected ‘const char * __restrict__’ but argument is of type ‘MYSQL_ROW’ 

모든 포인터?

답변

2

포인터와 배열과 관련된 여러 문제가 있습니다. 약간의 독서를하는 것이 좋습니다.

먼저 char * user[10]은 배열이 char이 아닌 10 char * 값을 정의합니다. 이는 내가 원하는 것으로 의심됩니다. 경고는 심지어 strcpy()char *을 기대하며 사용자 필드는 char **으로 표시됩니다.

두 번째로, 두 번째 인수에서 원하는 것에서 하나의 &입니다.

는 mysql.h 헤더 기술 :

typedef char **MYSQL_ROW;  /* return data as array of strings */ 

MYSQL_ROWchar 배열의 배열이다. []을 사용하면 역 참조를 수행하므로 strcpy()에 해당하는 char *으로 역 참조를 취한 다음 &을 사용하여 주소를 가져옵니다.

코드는 더 다음과 같아야합니다

struct login_session 
{ 
    char user[10]; 
    time_t time; 
    int length; 
}; 

while ((row = mysql_fetch_row(res)) != NULL) { 
    strcpy(records[cnt].user, row[0]); 
    cnt++; 
} 

난 당신이 MySQL의에서 오는 데이터에 대해이 보장 모르겠어요,하지만 당신은 행이 <= 10 문자는 것을 절대적으로 확신 할 수없는 경우 null 및 null ('\0')이 종료 된 경우 을 사용하여 user 배열이 오버플로 될 가능성을 피하십시오.

+0

mysql_fetch_lengths()를 호출하여 결과 내에서 현재 행의 열 길이를 가져온 다음 메모리를 할당하고 내용을 복사 할 수 있습니다. – jfly

+0

감사합니다. 나는 당신의 충고를 받아 포인터에 대한 추가 읽기를 할 것입니다. – Jacobm001