2016-10-27 8 views
-1

我正在使用C++將MySQL命令發送到服務器。爲什麼會說「分段錯誤」,這是什麼意思? 程序的當我運行它的輸出是:什麼是C++ mysql中的分段錯誤?

connection Succeeded 
Segmentation fault 

編輯代碼以除去第i + 1行,但仍具有相同的問題

的代碼:

#include <stdlib.h> 
#include <iostream> 
#include <mysql.h> 
#include <stdio.h> 
#define SERVER "localhost" 
#define USER "root" 
#define PASSWORD "coursework" 
int main() 
{ 
    MYSQL *connect; 
    connect=mysql_init(NULL); 
    if (!connect) 
    { 
     std::cout<<"MySQL Initialization failed"; 
     return 1; 
    } 
    connect=mysql_real_connect(connect, SERVER, USER, PASSWORD, NULL ,0,NULL,0); 

    if (connect) 
    { 
     std::cout<<"connection Succeeded\n"; 
    } 
    else 
    { 
     std::cout<<"connection failed\n"; 
     exit(1); 
    } 

    mysql_query (connect, "drop database if exists TTU;"); 
    mysql_query (connect,"create database TTU;"); 
    mysql_query (connect, "use TTU;"); 

    mysql_query (connect, "create table students(tnumber char(8) PRIMARY KEY,"); 
    mysql_query (connect, "firstname varchar(20) NOT NULL,"); 
    mysql_query (connect, "lastname varchar(20) NOT NULL,"); 
    mysql_query (connect, "dateofbirth date,"); 
    mysql_query (connect, "INDEX 'lastname_i' ('lastname'),"); 
    mysql_query (connect, "ENGINE=INNODB);"); 

    mysql_query (connect, "insert into students(tnumber, firstname, lastname, dateofbirth)"); 
    mysql_query (connect, "values (000, Joe, Smith, 1950-08-12);"); 

    MYSQL_RES *res_set; 
    MYSQL_ROW row; 
    mysql_query (connect,"select * from students;"); 
    unsigned int i =0; 
    res_set = mysql_store_result(connect); 
    unsigned int numrows = mysql_num_rows(res_set); 
    while ((row= mysql_fetch_row(res_set)) != NULL) 
    { 
     std::cout << row[i] << std::endl; 
    } 

    mysql_close (connect); 

    std::cout << "TEST" << std::endl; 
    return 0; 
} 
+0

這似乎是C++代碼而不是Java。 – CalmBit

+0

分段錯誤是當程序嘗試訪問它無權訪問的內存時發生的錯誤。 沒有發生錯誤的行號(使用調試器獲得),很難確定究竟是什麼導致了錯誤。 – CalmBit

+0

我不是這方面的專家,但你怎麼確定這裏有一個'i + 1'條目:'std :: cout << row [i + 1] << std :: endl;''? – PaulMcKenzie

回答

0

有所示代碼中存在多個錯誤。有兩個主要錯誤:錯誤地使用mysql_query(),以及重複失敗檢查各種MySQL庫函數的返回值,導致無法檢測到各種錯誤。

mysql_query (connect, "create table students(tnumber char(8) PRIMARY KEY,"); 

這不是有效的SQL。 mysql_query()需要完整SQL語句並執行它。它不會將多條連續調用中的單個SQL語句片斷分解出來,而只會在完整的SQL語句被解析後才執行。

由於顯示的代碼無法檢查來自mysql_query()的返回值,因此它無法檢測到調用mysql_query()這一整個調用序列失敗,並且表未創建。

後續調用也沒有檢查其他MySQL庫函數的返回值。

所示出的代碼很可能從mysql_store_result()得到一個NULL背面而沒有檢查它,經過一個NULL指針mysql_num_rows(),並崩潰。