当我尝试将内存分配给结构时,我正在观察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
(分配内存,然后是其元素。