0

简单来说,我声明了一个结构:

typedef struct
{

char* studentID;
char* studentName;
int* studentScores;

}STUDENT;

然后我声明了一个指针并为指针和每个元素分配了内存:

STUDENT* studentPtr = NULL;

   if ((studentPtr = (STUDENT*) calloc (5, sizeof(STUDENT))) == NULL)
{
    printf("Not enough memory\n");
    exit(100);
}

{
    if ((studentPtr->studentID = (char*) calloc (20, sizeof(char))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }

    if ((studentPtr->studentName = (char*) calloc (21, sizeof(char))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }
    if ((studentPtr->studentScores = (int*) calloc (5, sizeof(int))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }

之后,我想从文件中读取 5 条记录,但由于我的增量,当我尝试运行程序时出现错误。(如果我有类似“char studentName[20];”之类的东西,它工作得很好)我应该如何增加指针以达到我想要的结果?它必须采用指针表示法。

STUDENT* ptr = studentPtr;

while (*count < MAX_SIZE)
{
    fscanf(spData, "%s %*s %*s %*d %*d %*d %*d %*d", ptr->studentName)
    (*count)++;
    ptr++;
}

File Content:

Julie Adams 1234    52  7   100 78  34

Harry Smith 2134    90  36  90  77  30

Tuan Nguyen 3124    100 45  20  90  70

Jorge Gonzales  4532    11  17  81  32  77

Amanda Trapp    5678    20  12  45  78  34

最后一个问题:如果我保留声明的结构并为其正确分配内存。完成后如何释放它?应该是这样的吗?

for (STUDENT* ptr = studentPtr; ptr < studentPtr + *count; ptr++)
{   //*count is the number of records
    free(ptr->studentID);
    free(ptr->studentName);
    free(ptr->studentScores);
}
  free(studentPtr);
4

2 回答 2

2

问题是您只为 studentPtr[0] 中的字段分配了内存。表 a 中的其余四个条目仍然为零。

尝试这个:

int i;
for (i = 0; i < 5; i++)
{
    if ((studentPtr[i]->studentID = (char*) calloc (20, sizeof(char))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }

    if ((studentPtr[i]->studentName = (char*) calloc (21, sizeof(char))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }
    if ((studentPtr[i]->studentScores = (int*) calloc (5, sizeof(int))) == NULL)
    {
        printf("Not enough memory\n");
        exit(100);
    }
}

事实上,通过为各个字段使用动态分配的内存,您的生活变得更加艰难。您不仅需要显式分配每个字段(并且可能稍后释放它们),这会花费代码和时间,而且还会在堆表中产生额外的内存开销。如果您的字段是可变大小的,这将是必要的,但它们是固定大小的,因此直接数组更有效。

所以,我最终会这样:

typedef struct
{
  char studentID[20];
  char studentName[21];
  int studentScores[5];
} STUDENT;

STUDENT studentPtr[5];
于 2013-03-08T10:08:42.027 回答
1

首先,您将内存分配给结构指针的内存是结构内存的 5 倍。

再次在同一行上,您仅将内存分配给您分配的第一个结构(5 个结构)。

您应该执行 5 次,因为您有 5 个结构,例如:

for (i = 0; i < 5; i++)
{
//Do assignments to each element in structure not more than required
//as you are doing in your code:
studentPtr[i]->studentScores = (int*) calloc(5,sizeof(int))
//so your assignment of memory should be:
studentPtr[i]->studentScores = (int*) calloc(sizeof(int))
}
于 2013-03-08T10:31:52.970 回答