2012-03-30 8 views
0

次のコードでセグメンテーション違反が発生しています。お知らせ下さい。strcpyを使用している間に繰り返しセグメンテーションエラーが発生する

struct columns { 
     char* c_name; 
     char* c_type; 
     char* c_size; 
}; 

int main(int argc, char* argv[]) 
{ 
    int column_num = 3; 
    struct columns col[10]; 
    //columns *col = (columns*) malloc (sizeof(columns) * column_num); 
    strcpy(col[0].c_name, "PSID"); 
    strcpy(col[0].c_type, "INT"); 
    strcpy(col[0].c_size, "4"); 
} 

2つの方法で列構造のスペースを割り当てていますが、引き続きセグメンテーションフォルトが発生します。何か不足していますか?

+0

SO ... – UmNyobe

+1

CまたはC++で最も聞かれる質問だと?これは重要です。これを行う方法(「イディオム的に」)は両方の言語で異なります。 – Mat

+0

あなたのメインにはreturn文が必要です。 – saadtaame

答えて

2

strdupは、ストレージの世話をするが、作業が完了したときに解放することを忘れないでください)、これを試してみてください:

struct columns { 
    char* c_name; 
    char* c_type; 
    char* c_size; 
}; 

int main(int argc, char* argv[]) 
{ 
    int column_num = 3; 
    struct columns col[10]; 

    col[0].c_name = strdup("PSID"); 
    col[0].c_type = strdup("INT"); 
    col[0].c_size = strdup("4"); 

    return 0; 
} 
5

構造内のポインタは実際には何も初期化されません。それらに次元を与えたり、動的にメモリを割り当てる必要があります。

+0

正確な答え... –

1

メモリを割り当てずに、char*ポインタを初期化しないでください。

もちろん

strcpy(col[0].c_name=malloc(sizeof "PSID"),"PSID"); 

ように、あなたは、エラーをチェックし、それがそうでなければ有意義なものにする必要があります。

1

columns構造体には領域を割り当てますが、格納する文字列には領域を割り当てません。ポインタ(つまり、c_name)は初期化されず、ランダムなメモリ位置を指しているため、未定義の動作がすぐに呼び出されます。

2

col[0].c_nameはポインタですが、メモリをポイントしません。だからこそセグメンテーションが起こります。

何かをコピーする前に、配列char c_name[256];またはmalloc()を使用してメモリを割り当てます。

関連する問題