在函数中填充结构字段时出现malloc分段错误

在函数中填充结构字段时出现malloc分段错误,c,pointers,struct,C,Pointers,Struct,我有一个结构定义为 struct _element; typedef struct _element Element; struct _element { char* StudentName; char* StudentID; int StudentMarks; }; 指向元素结构的指针全局声明为 Element * ePtr; 现在我有了一个函数,它返回一个指向元素结构的指针。其定义如下所示。在该函数中填充并返回全局声明的相同的ePtr Element * Cr

我有一个结构定义为

struct _element;
typedef struct _element Element;

struct _element {

    char* StudentName;
    char* StudentID;
    int StudentMarks;
};
指向
元素
结构的指针全局声明为

Element * ePtr;
现在我有了一个函数,它返回一个指向
元素
结构的指针。其定义如下所示。在该函数中填充并返回全局声明的相同的
ePtr

Element * CreateElement(char * jName, char * jID, int jMarks)
{
    printf("CreateElement \n");
    puts(jName); puts(jID); printf("%d\n",jMarks);

    ePtr->StudentName = (char*)malloc(sizeof(char)*strlen(jName));

    strcpy(ePtr->StudentName, jName);

    printf("After Creation \n");
    puts(ePtr->StudentName);

    return ePtr;
}
我使用

ePtr = CreateElement(iName,iID,iMarks);
从另一个函数。参数中存储的值是正确的,如函数调用行下方的
puts
printf
命令所示

我的问题是,我得到了一个分段错误在

ePtr->StudentName = (char*)malloc(sizeof(char)*strlen(jName));

线路。我使用gdb检查了相同的问题。

您是否为
ePtr
分配了内存

仅全局声明指向此结构的指针是不够的:还需要
malloc
一些内存:
ePtr=malloc(sizeof(Element);

另外,请确保在
malloc
中为空终止符的字符串添加额外的插槽


通常,总是初始化指向
NULL
的指针-在声明全局:
元素*ePtr=NULL;
时,您可以这样做。此外,尝试将
ePtr
从全局范围中移出,并在使用指针之前检查
NULL
,就像
createleme中的
ePtr
一样nt
方法。

您是否为
ePtr
分配了内存

仅全局声明指向此结构的指针是不够的:还需要
malloc
一些内存:
ePtr=malloc(sizeof(Element);

另外,请确保在
malloc
中为空终止符的字符串添加额外的插槽


通常,总是初始化指向
NULL
的指针-在声明全局:
元素*ePtr=NULL;
时,您可以这样做。此外,尝试将
ePtr
从全局范围中移出,并在使用指针之前检查
NULL
,就像
createleme中的
ePtr
一样nt
方法。

您不为其分配任何内存

ePtr = (Element*)malloc(sizeof(Element));
在开始为其赋值并最终从函数返回之前

还需要为字符串的nul终止符留出空间

ePtr->StudentName = (char*)malloc(sizeof(char)*(strlen(jName) + 1));
最后,不要忘记为ID分配内存并复制ID值,并将studentMarks复制到元素中


请记住,元素的大小是固定的。它需要内存来容纳两个
char*
和一个
int
。为元素分配内存时,字符串的长度是可变的并不重要。

您不会为元素分配任何内存

ePtr = (Element*)malloc(sizeof(Element));
在开始为其赋值并最终从函数返回之前

还需要为字符串的nul终止符留出空间

ePtr->StudentName = (char*)malloc(sizeof(char)*(strlen(jName) + 1));
最后,不要忘记为ID分配内存并复制ID值,并将studentMarks复制到元素中


请记住,元素的大小是固定的。它需要内存来容纳两个
char*
和一个
int
。为元素分配内存时,字符串的长度是可变的并不重要。

您需要为ePtr分配一些内存,然后才能将内存分配给它包含的char*。在函数开始时的ePtr

在全球范围内声明ePtr也没有什么意义,但这并不是破坏程序的原因

ePtr = (Element*)malloc(sizeof(Element));

在使用之前,您可能还应该检查ePtr在此之后是否为null(如果内存不足以及其他一些问题,则可能为null)。

您需要为ePtr分配一些内存,然后才能将内存分配给它包含的字符*。在函数开始时对ePtr执行malloc

在全球范围内声明ePtr也没有什么意义,但这并不是破坏程序的原因

ePtr = (Element*)malloc(sizeof(Element));

在使用之前,您可能还应该检查ePtr在此之后是否为null(如果内存不足以及其他一些问题,则可能为null).

但我不确定要分配给ePtr多少内存。因为字段的长度可以不同。事实上,我尝试了您编写的方法。GCC给出了一个错误,它不是常量大小。这很好,到时候您将为这些指针分配
malloc
空间,就像您已经在做的那样。执行
malloc(sizeof(Element))
int
和指针提供了足够的空间,您已经为代码中指向的字符串留出了空间。我将全局声明替换为元素*ePtr=(元素*)malloc(sizeof(元素));现在它说:错误:初始值设定项元素不是常量,因为它是文件作用域,请在函数中尝试它,例如
main
,或者在
CreateElement
函数的开头,或者在init函数中。在最初的问题中,gdb显示了发生在
ePtr->StudentName=(char*)malloc(sizeof(char)之后的seg错误*斯特伦(jName))
已执行。但我不确定要分配给ePtr的内存量。因为字段的长度可能不同。事实上,我尝试了您编写的操作。GCC给出了一个错误,它不是常量大小。这很好,到时候您将
malloc
为这些指针留出空间,就像您已经在做的那样。执行
malloc(sizeof(Element))
int
和指针提供了足够的空间,您已经为代码中指向的字符串留出了空间。我将全局声明替换为Element*ePtr=(Element*)malloc(sizeof(Element));现在它说:错误:初始值设定项元素不是常量,因为它是文件作用域,请在函数中尝试它,例如
main
,或者在
CreateElement
函数的开头,或者在init函数中。在最初的问题中,gdb显示了发生在
ePtr->StudentName=(char*)malloc(sizeof(char)之后的seg错误*strlen(jName));
被执行。我尝试了