0

我有一个结构定义为

struct _element;
typedef struct _element Element;

struct _element {

    char* StudentName;
    char* StudentID;
    int StudentMarks;
};

指向结构的指针Element被全局声明为

Element * ePtr;

现在我有一个函数,它返回一个指向结构的指针Element。这定义如下所示。在此函数中填充全局声明的相同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 进行了同样的检查。

4

3 回答 3

2

您是否为 分配任何内存ePtr

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

还要确保在malloc您的字符串中为空终止符添加一个额外的插槽。

一般来说,总是初始化你的指针NULL——你可以在声明 global: 时这样做Element *ePtr = NULL;。此外,尝试让您ePtr脱离全局范围,并NULL在使用指针之前进行检查,就像ePtr在您的CreateElement方法中一样。

于 2012-07-24T04:24:34.000 回答
1

您没有将任何内存分配给

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

在您开始为其赋值并最终从函数中返回它之前。

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

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

最后别忘了为ID分配内存并复制ID的值,并将studentMarks复制到Element中。

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

于 2012-07-24T04:24:42.737 回答
1

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

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

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

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

于 2012-07-24T04:29:19.090 回答