中使用双重指针
将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 student));
ptr->id = 1;
ptr->cgpa = 4.00;
sprintf(ptr->name,"murad");
printf("In Initfunc:nname %snid %dncgpa %lfn",ptr->name,ptr->id,ptr->cgpa);
}
int main()
{
struct student *murad;
init(murad);
printf("IN Main:nname %snid %dncgpa %lfn",murad->name,murad->id,murad->cgpa);
free(murad);
return 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 %snid %dncgpa %lfn",temp->name,temp->id,temp->cgpa);
}
int main()
{
struct student *murad;
init(&murad);
printf("IN Main:nname %snid %dncgpa %lfn",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}
请注意,在Init
,因为您将malloc
的结果分配给本地变量ptr
,该变量仅在init
的范围内可用。您没有在main
的范围内将其分配给本地变量murad
。
由于init
ptr
可能会更好另外,请不要抛出Malloc的结果。这是糟糕的风格,潜在的危险。
printf("IN Main:nname %snid %dncgpa %lfn",murad->name,murad->id,murad->cgpa);
这会导致错误。当您分配内存为构造指针内部函数时,这是murad
的副本,您将作为参数传递。因此,没有记忆分配给main
中的指针,您的 dereference notialized指针导致不确定的行为。
您需要从功能到main
的return
指针。
这样您的程序可以像这样 -
#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 %snid %dncgpa %lfn",ptr->name,ptr->id,ptr->cgpa);
return ptr; // <--- return pointer
}
int main()
{
struct student *murad;
murad=init();
printf("IN Main:nname %snid %dncgpa %lfn",murad->name,murad->id,murad->cgpa);
free(murad);
return 0;
}