malloc中的分段错误:

时间:2016-06-19 07:56:50

标签: c++ c segmentation-fault malloc

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

3 个答案:

答案 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的结果。风格很差,有潜在危险。