gpt4 book ai didi

c - 增加指向结构的指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:29:25 25 4
gpt4 key购买 nike

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

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);

最佳答案

问题是您只为 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];

关于c - 增加指向结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com