2017-09-30 19 views
0

で正しい方法で割り当てる配列である私は、私は、MySQLからデータを取っています、これは完全にオフになる場合もありますので、合計noobのだが、メインで、なぜ構造体

struct staff{ 
    int id; 
    char lastdate[8]; 
    char codeid[8]; 
}; 

... 
while((row = mysql_fetch_row(confres))) 
{ 
    char *codeid = row[0]; 
    char *maxdate = row[1]; 

    info[i].id=i; 
    strcpy(info[i].codeid, codeid); 
    strcpy(info[i].lastdate, maxdate); 

    i++; 
} 
... 

lastdateはYYYYMMDD形式で、codeidは文字列です。

配列を印刷するときに、なぜlastdateは正常ですが、codeidは文字列だけですか?

ID: 0 
    SHORT: 
    LAST DATE : 20170929 

ID: 1 
    SHORT: 
    LAST DATE : 20170929 
... 
+0

'codeid'が文字列の場合、' row [0] 'にも文字列を含める必要があります。したがって、 'char * codeid = row [0];の代わりに' char * codeid =&row [0]; 'を使用してください。 – Gaurav

+0

それは私に警告を与えます:互換性のないポインタ型からの初期化[-Wincompatible-pointer-types] char * codeid =&row [0]; – Ommik

+2

最後の日付のヌルターミネータのためのスペースは予約されておらず、バッファオーバーフローのために自分自身を設定して、文字列の長さをチェックしていません。 –

答えて

2

あなたは、日付とNULL終端の8つの文字を保持するのに十分な大きlastdateを行う必要があり、その構造は次のようになります。

struct staff{ 
    int id; 
    char lastdate[9]; 
    char codeid[8]; 
}; 

あなたは、その結果、配列、外に書いていました未定義の動作。