在函数中填充结构字段时出现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));
被执行。我尝试了