2017-05-05 87 views
-1

我在观察segmentation fault,当我尝试分配内存的结构。Segfault虽然malloc在C结构

memcpy()之后我试图将一个更多结构的内容复制到上述结构中。

下面是代码片断:

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

[请参阅此讨论关于为什么不在'C'中输入'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+0

什么是memcpy?哪里? – Lundin

回答

-1

需要为db1第一分配存储器(通过malloc),那么它的元件。

4

在你main功能的顶部,你声明db1为:

struct db *db1; 

它是一个未初始化的指针,所以你必须取消引用之前的尖struct db分配内存给其成员:

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

此外记笔记malloc & co。可能失败:经常检查thier返回值

最后你想在db1结构分配为st1空间,只是之后将要覆盖(内存泄漏)使用指针:

db1->s1 = student1; 
+0

我想你错过了一开始就提到“变量”。 :) –

+0

@SouravGhosh大概我需要咖啡:我没有得到你.. – LPs

+0

对不起,如果我不清楚......'你必须分配struct 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;  // 

但后来,你做

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

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

不为db分配适当的内存。

也就是说,如果你要分配另一个指向指针的指针,你不需要为目标指针保留内存。您只是将指针指向有效的(取决于源指针的“有效性”)。

如果您尝试直接使用任何指针(例如,目标strcpy())所指向的内存位置(读取或写入)而没有任何先前的分配,则需要先分配内存。

强制性建议: