2017-05-05 15 views
-1

私は構造体にメモリを割り当てようとしたときにsegmentation faultを観察しています。Segfault C構造のmalloc中

memcpy()の後、もう1つの構造の内容を上記の構造にコピーしようとしています。以下

コードスニペットである:

struct student { 
    char *username; 
    char *id; 
    int roll; 
}; 

struct db { 
    struct student *s1; 
    struct student *s2; 
}; 

void print_struct(struct student *); 

int main (void) { 
    struct student *student1, *student2; 
    struct db *db1; 
    char *name = "ram"; 
    char *id = "200ABCD"; 
    int roll = 34; 

    student1 = (struct student *)malloc(sizeof(struct student)); 
    student1->username = name; 
    student1->id = id; 
    student1->roll = roll; 

    printf("\nStudent 1\n"); 
    print_struct(student1); 

    printf("\nStudent 2\n"); 
    student2 =student1; 
    print_struct(student2); 

    printf("\nDb of s1\n"); 
    db1->s1 = (struct student *)malloc(sizeof(struct student)); ===> segfault here 
    db1->s1 = student1; 
    print_struct(db1->s1); 

    return 0; 
} 

void print_struct(struct student *s) { 
    printf("Name: %s\n", s->username); 
    printf("Id: %s\n", s->id); 
    printf("R.No: %d\n", s->roll); 
    return; 
} 
+1

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由については、この記事を参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+0

memcpyは何ですか?どこ? – Lundin

答えて

-1

あなたは、その要素、その後、最初の(mallocを通して)db1にメモリを割り当てる必要があります。あなたのmain機能の上部に

4

あなたはとしてdb1を宣言した:それは初期化されていないポインタであるので、あなたはそのメンバーに逆参照する前に先の尖ったstruct dbためのメモリを割り当てる必要があります

struct db *db1; 

db1 = malloc(sizeof(struct db)); 
if (db1 != NULL) 
{ 
    db1->s1 = malloc(sizeof(struct student)); 
} 

さらに、malloc & co。失敗することがあります。は常に(メモリリーク)を使用して、ポインタあなたがdb1構造体にst1のためのスペースを割り当てることをしようとしているが、その直後、あなたが上書きされている最後

thier返された値をチェックします。

db1->s1 = student1; 
+0

私はあなたが最初に "変数"について言及していなかったと思います。 :) –

+0

@SouravGhoshおそらく私はコーヒーが必要です:私はあなたを取得していません.. – LPs

+0

申し訳ありませんが、私は明確ではなかった... 'あなたは構造体db'を割り当てる必要があります適切ではない、変数' db1'について言及する必要がありますタイプ 'struct db'..inn'it? –

4

をごコードが矛盾しています。自分で見て。最初のケースで

は、あなたが

student1 = (struct student *)malloc(sizeof(struct student)); 

/* Considering malloc success, 'student' points to valid memory */ 

student1->username = name; // 
student1->id = id;   //all the access are OK 
student1->roll = roll;  // 

をしましたが、後で、あなたはdbのための適切なメモリを割り当てることなく

db1->s1 = (struct student *)malloc(sizeof(struct student)); 
db1->s1 = student1; 

/* Wait, how do you know 'db' points to anything valid, at all? */ 

をしました。

に行くとポインタに別のポインタを割り当てると、宛先ポインタのメモリを予約する必要はありません。すでにが有効な(ソースポインタの「有効性」に応じて)を指すようにポインタを設定するだけです。

事前に割り当てなしでポインタ(例:宛先:strcpy())が直接指し示す(読み書きする)メモリ位置を使用する場合は、まずメモリを割り当てる必要があります。

必須の提案:

関連する問題