C++ malloc中的分段错误:
将malloc()returnd值赋给函数参数,然后访问该函数的外部。。。这里怎么了?我的示例代码:C++ malloc中的分段错误:,c++,c,segmentation-fault,malloc,C++,C,Segmentation Fault,Malloc,将malloc()returnd值赋给函数参数,然后访问该函数的外部。。。这里怎么了?我的示例代码: #include <stdio.h> #include <stdlib.h> struct student{ double cgpa; int id; char name[100]; }; void init(student *ptr) { ptr = (struct student*)malloc(sizeof(struct stu
#include <stdio.h>
#include <stdlib.h>
struct student{
double cgpa;
int id;
char name[100];
};
void init(student *ptr)
{
ptr = (struct student*)malloc(sizeof(struct student));
ptr->id = 1;
ptr->cgpa = 4.00;
sprintf(ptr->name,"murad");
printf("In Initfunc:\nname %s\nid %d\ncgpa %lf\n",ptr->name,ptr->id,ptr->cgpa);
}
int main()
{
struct student *murad;
init(murad);
printf("IN Main:\nname %s\nid %d\ncgpa %lf\n",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}
#包括
#包括
结构学生{
双cgpa;
int-id;
字符名[100];
};
无效初始(学生*ptr)
{
ptr=(结构学生*)malloc(大小(结构学生));
ptr->id=1;
ptr->cgpa=4.00;
sprintf(ptr->名称,“murad”);
printf(“在Initfunc:\nname%s\nid%d\ncgpa%lf\n”中,ptr->name,ptr->id,ptr->cgpa);
}
int main()
{
结构学生*murad;
init(murad);
printf(“在Main:\nname%s\nid%d\ncgpa%lf\n”,murad->name,murad->id,murad->cgpa);
免费(穆拉德);
返回0;
}
这导致了错误。当您将内存分配给函数中的结构指针时,它是murad
的副本,您将作为参数传递。因此,在main
中没有为指针分配内存,您取消引用未初始化的指针,从而导致未定义的行为
您需要将指针从函数返回到main
所以你的程序可以是这样的-
#include <stdio.h>
#include <stdlib.h>
struct student{
double cgpa;
int id;
char name[100];
};
struct student * init(void) // <-- No need to pass any parameter
{
struct student *ptr = malloc(sizeof(struct student));
ptr->id = 1;
ptr->cgpa = 4.00;
sprintf(ptr->name,"murad");
printf("In Initfunc:\nname %s\nid %d\ncgpa %lf\n",ptr->name,ptr->id,ptr->cgpa);
return ptr; // <--- return pointer
}
int main()
{
struct student *murad;
murad=init();
printf("IN Main:\nname %s\nid %d\ncgpa %lf\n",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}
#包括
#包括
结构学生{
双cgpa;
int-id;
字符名[100];
};
struct student*init(void)//id=1;
ptr->cgpa=4.00;
sprintf(ptr->名称,“murad”);
printf(“在Initfunc:\nname%s\nid%d\ncgpa%lf\n”中,ptr->name,ptr->id,ptr->cgpa);
返回ptr;//名称,murad->id,murad->cgpa);
免费(穆拉德);
返回0;
}
问题是您没有返回新指针。
试试这个:
#include <stdio.h>
#include <stdlib.h>
struct student{
double cgpa;
int id;
char name[100];
};
void init(struct student **ptr)
{
struct student *temp;
*ptr = (struct student*)malloc(sizeof(struct student));
temp = *ptr;
temp->id = 1;
temp->cgpa = 4.00;
sprintf(temp->name,"murad");
printf("In Initfunc:\nname %s\nid %d\ncgpa %lf\n",temp->name,temp->id,temp->cgpa);
}
int main()
{
struct student *murad;
init(&murad);
printf("IN Main:\nname %s\nid %d\ncgpa %lf\n",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}
#包括
#包括
结构学生{
双cgpa;
int-id;
字符名[100];
};
void init(结构学生**ptr)
{
结构学生*temp;
*ptr=(结构学生*)malloc(大小(结构学生));
温度=*ptr;
温度->id=1;
温度->cgpa=4.00;
sprintf(临时->名称,“murad”);
printf(“在Initfunc:\nname%s\nid%d\ncgpa%lf\n”中,temp->name,temp->id,temp->cgpa);
}
int main()
{
结构学生*murad;
init&murad;
printf(“在Main:\nname%s\nid%d\ncgpa%lf\n”,murad->name,murad->id,murad->cgpa);
免费(穆拉德);
返回0;
}
请注意在init中使用双指针,因为您正在将malloc
的结果赋给局部变量ptr
,该变量仅在init
范围内可用。您没有将其分配给main
范围内的局部变量murad
作为init
另外,请不要施放malloc的结果。这是一种很差的样式,潜在的危险。oT:BTW,如果你用C编译器编译这个,就删除这个无用的Maloc的结果。这个代码> Valuit init(学生*PTR)< /C>是无效的。如果编译的话,你似乎在用C++编译器编译。你也没有返回新的指针。@ JuangopangZa:“返回”在这个上下文中是不明确的。@alk我不这么认为,但不管怎样。@alk介意通过return
语句或通过将其分配给*ptr
来解释这个模糊的“returning”。
#include <stdio.h>
#include <stdlib.h>
struct student{
double cgpa;
int id;
char name[100];
};
void init(struct student **ptr)
{
struct student *temp;
*ptr = (struct student*)malloc(sizeof(struct student));
temp = *ptr;
temp->id = 1;
temp->cgpa = 4.00;
sprintf(temp->name,"murad");
printf("In Initfunc:\nname %s\nid %d\ncgpa %lf\n",temp->name,temp->id,temp->cgpa);
}
int main()
{
struct student *murad;
init(&murad);
printf("IN Main:\nname %s\nid %d\ncgpa %lf\n",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}