2016-10-27 18 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

これはJavaではなくC++コードのようです。 – CalmBit

+0

セグメンテーションフォールトは、プログラムがアクセス権を持たないメモリにアクセスしようとしたときに発生するエラーです。 (デバッガを用いて得られた)エラーが発生している行番号なし は、それがエラーの原因となっている正確に判断するのは難しいです。 – CalmBit

+0

は、私は、この特定のAPIには専門家ではないが、どのように '私は+ 1 'のエントリがここに必ずあります:'のstd :: coutの<<行[I + 1] <<はstd ::てendl; '? – PaulMcKenzie

答えて

0

があります。示されたコードに複数のバグがあります。 mysql_query()の誤った使用方法、および繰り返し失敗さまざまなエラーを検出するために失敗し、その結果、様々なMySQLのライブラリ関数からの戻り値をチェックするための2つの主要なバグがあります。

これは有効なSQLではありません。 mysql_query()は完全SQL文を取り、それを実行します。複数の連続した呼び出しに分割されたSQL文の個々の断片をとらず、完全なSQL文が解析されるとそれを実行します。

戻り値がmysql_query()であることを確認できないため、mysql_query()呼び出しのこのシーケンス全体が失敗し、テーブルが作成されなかったことが検出されません。

以降の呼び出しは、他のMySQLライブラリ関数からの戻り値をチェックするために失敗しました。

示すコードの可能性が高いバックmysql_store_result()からNULLを取得しているが、それをチェックするために失敗し、mysql_num_rows()NULLポインタを渡し、そしてクラッシュします。

関連する問題