将malloc()的返回值分配给一个函数参数,然后访问该函数的外部......这里有什么问题?我的示例代码:
#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;
}
答案 0 :(得分:1)
printf("IN Main:\nname %s\nid %d\ncgpa %lf\n",murad->name,murad->id,murad->cgpa);
这导致错误。当您将内存分配给函数内的结构指针时,该函数是您作为参数传递的murad
的副本。因此,没有为main
中的指针分配内存,并且取消引用未初始化的指针,导致未定义的行为。
您需要return
指针从函数到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;
}
答案 1 :(得分:1)
问题是你没有返回新指针 试试这个:
#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;
}
注意在init
中使用双指针答案 2 :(得分:1)
因为您要将malloc
的结果分配给局部变量ptr
,该变量仅在init
的范围内可用。您没有将其分配到murad
范围内的本地变量main
。
从ptr
init
可能更好
另外,请不要转换malloc的结果。风格很差,有潜在危险。