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 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指针导致不确定的行为

您需要从功能到mainreturn指针。

这样您的程序可以像这样 -

#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; 
}

相关内容

  • 没有找到相关文章