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つのレコードを読み込みたいのですが、インクリメントのためにプログラムを実行しようとするとエラーが発生します。(「charstudentName [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]のフィールドにのみメモリを割り当てていることです。テーブルの残りの4つのエントリはまだゼロになっています。

これを試して:

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 に答える