segfault时,在C结构中的malloc



当我尝试将内存分配给结构时,我正在观察segmentation fault

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 1n");
    print_struct(student1);
    printf("nStudent 2n");
    student2 =student1;
    print_struct(student2);
    printf("nDb of s1n");
    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: %sn", s->username);
    printf("Id: %sn", s->id);
    printf("R.No: %dn", s->roll);
    return;
}

您的代码不一致。为自己看看。

首先,您做了

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()的目的地(直接使用内存位置(读取或写入(,而无需任何事先调解,则需要先分配内存。

强制性建议:

  • 请参阅此讨论,以了解为什么不施放 malloc()C中的家人的返回值。
  • 始终检查针对NULL的返回指针,以确保malloc()在使用返回指针之前成功。

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

struct db *db1;

它不是初始化的指针,因此您必须在将其放置之前为尖的struct db分配内存:

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

此外,请注意Malloc&公司可以失败:始终检查THIER返回的值

最后,您试图在db1结构中为st1分配空间,但是在此之后,您正在覆盖(内存泄漏(指针使用:

db1->s1 = student1;

首先需要为db1(通过malloc(分配内存,然后是其元素。

最新更新