2011-05-03 4 views
1

모두 작동하는 것처럼 보입니다. 그러나 NULL이있는 MySQL 필드가 있으면 Segmentation Fault가 발생합니다.C 프로그램 : NULL을 포함하는 필드가있는 MySQL에서 선택할 때 세그먼트 오류

int 
selectDB(char * cmd) 
{ 
    printf("Cmd: %s\n", cmd); 
    MYSQL *conn; 
    MYSQL_RES *result; 
    MYSQL_ROW row; 
    int i; 

    conn = mysql_init(NULL); 

    if (conn == NULL) { 
     printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); 
     exit(1); 
    } 

     if (mysql_real_connect(conn, "localhost", "root", 
    "myPassword", "myDB", 0, NULL, 0) == NULL) 
    { 
     printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); 
     exit(1);  
    } 

    if (mysql_query(conn, cmd)) 
    { 
     printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); 
     exit(1); 
    } 

    if (!(result = mysql_store_result(conn))) 
    { 
     printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); 
     exit(1); 
    } 

    while((row = mysql_fetch_row(result))) { 
     for (i=0 ; i < mysql_num_fields(result); i++) 
      printf("%s\n", row[i]); 
    } 

    if (!mysql_eof(result)) 
    { 
     printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); 
     exit(1); 
    } 

    mysql_free_result(result); 
    mysql_close(conn); 
    return 0; 
} 

내가

char cmd[1000]; 
snprintf(cmd, 999, "SELECT * FROM users WHERE id = %s", valueptr); 
selectDB(cmd); 
+0

어느 라인 (들)가 독방 감금 오류를 얻고있다 :

NULL values in the row are indicated by NULL pointers. 

당신은 뭔가를해야합니까? – Chad

+0

나는 속임수를 말하는 것이 아니라, 반드시 ... - OP가 mysql이 NULL 포인터를 줄에 넣을 수 있다는 것을 알지 못하는 것 같습니다. – Claudiu

+0

@ Claudio- 네 말이 맞아. 이것은 그를 도울 수는 있지만 멍청이는 아닙니다. 죄송합니다. – MByD

답변

2

:

for (i=0 ; i < mysql_num_fields(result); i++) 
     printf("%s\n", row[i] ? row[i] : "NULL"); 
+0

감사합니다. 방금 내 가정을 확인했습니다. –

1

내 유일한 추측으로 전화 해요 : :

당신이 할 경우 :

printf("%s\n", row[i]); 

그것이 예상 여기

코드입니다 문자열에 대한 포인터. 널 (NULL을 포함하는 문자열에 대한 포인터가 아닌 NULL)을 NULL로 제공하면 메모리 위치 0x00에있는 내용을 인쇄하려고 시도하고 세그먼트 화 오류가 발생합니다.

인쇄하기 전에 row[i]이 유효한 포인터 (NULL이 아닌)인지 확인하십시오.

또한 행에 정수 나 문자열 외에 문자열이 있으면 segfault도 표시됩니다. the MySQL docs에서