【问题标题】:C program: Segmentation fault when selecting from MySQL with field that contains NULLC 程序:从 MySQL 中选择包含 NULL 的字段时出现分段错误
【发布时间】:2011-05-03 18:41:50
【问题描述】:

似乎一切正常,但如果 MySQL 字段中有 NULL,我会收到分段错误。

代码如下:

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);

【问题讨论】:

  • 您在哪条线路上遇到了段错误?
  • 我不会说是骗人的,必然... - 似乎 OP 不知道 mysql 可以将 NULL 指针放在行中。
  • @Claudio-你是对的。这可能对他有帮助,但不是骗人的。对不起。

标签: mysql c null


【解决方案1】:

来自the MySQL docs

NULL values in the row are indicated by NULL pointers. 

你需要这样的东西:

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

【讨论】:

  • 谢谢,这证实了我的假设。
【解决方案2】:

我唯一的猜测:

当你这样做时:

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

它需要一个指向字符串的指针。当您给它 NULL(不是指向包含 NULL 的字符串的指针,而是 NULL)时,它会尝试打印内存位置 0x00 处的内容并给出分段错误。

在打印之前尝试检查 row[i] 是否为有效指针(非 NULL)。

此外,如果您的行中包含任何整数或除字符串之外的任何其他内容,您也会收到段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 2015-03-20
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多