Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ malloc中的分段错误:_C++_C_Segmentation Fault_Malloc - Fatal编程技术网

C++ malloc中的分段错误:

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

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