6

Cで構造体、ポインター、動的配列について学習しようとしています。ポインターを使用して構造体の動的配列を作成する方法がわかりません。私のコードは機能せず、何が問題なのかわかりません。動的配列の例をいくつか見てきましたが、構造体はありません。どんな助けでもいただければ幸いです。この問題を解決するだけでなく、理解したいので、コードスニペットだけでなく、いくつかの説明をお願いします。

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

struct *struct_array;
int i,m,n,p;

struct data
{
    char inputA[20];
    char inputB[20];    
};

struct data get_data()
{
    struct data thisdata;

    printf("Please enter input A\n");
    scanf("%s", thisdata.inputA);

    printf("Please enter input B\n");
    scanf("%s", thisdata.inputB);

    return thisdata;
}

void Output(struct data struct_array, int n)
{
    int index = 0;
    for(i = 0; i<n ;i++)
    {
        printf("%s ", struct_array[i].inputA);
        printf("%s ", struct_array[i].inputB);
    }   
}

void resizeArray(int n)
{
    struct_array = (int*)realloc(n*sizeof(int));
}

void mainMenu()
{
    printf("Please select from the following options:\n");
    printf("1: Add new students to database\n");
    printf("2: Display current student database contents\n");
    printf("3: exit the program\n");
    scanf("%d", &p);
    if(p == 1)
    {
        printf("Please enter the number of students to register:\n");
        scanf("%d", &n);
        resizeArray(n);
        for(i = n; i<n ;i++)
        {
            struct_array[i] = get_data();
        }
    }
    else if(p == 2)
    {
         Output(struct_array, n);
    }
    else
    {
        free(struct_array);
        exit(0);
    }        
}

int main()
{    
    struct_array = (int*)realloc(2*sizeof(int));
    mainMenu();
}
4

4 に答える 4

5

あなたの定義

struct *struct_array;

は誤りです。タイプの名前を使用する必要がありますdata

struct data *struct_array;

このようにして、配列を割り当てることができます

struct_array = malloc(MaxNumElements * sizeof(struct data));

後でメモリを解放する必要があります

free(struct_array);

編集:型定義は var 宣言の前に行う必要があります。

struct data ....

struct data* your_variable;

PSタイプstructを使用するたびにキーワードを入力したくない場合は、次を使用します。datatypedef

typedef struct data_s
{
   char inputA[20];
   char inputB[20];    
} data;
于 2012-10-20T17:08:22.260 に答える
5

ソース コードにいくつかのエラーがあります。

  • struct *struct_array;(l.5)
    どういう意味ですか? 書きたかったのstruct data *struct_array

  • printf("%s ", struct_array[i].inputA);(l.32 & l. 33)
    引数struct_arrayがグローバル宣言をマスクしていますが、配列ではありません。なぜこの引数を追加したのですか?

  • struct_array = (int *)realloc(n * sizeof(int));(l. 39)
    引数を忘れました。malloc代わりに使いたいですか?その上、キャストは必要ありません (そして正しくありません!)。

  • ホストされた環境と C99/C11 を使用していない限り、から値を返す必要がありますmain

  • あなたの変数indexは使用されていません。なんで宣言したの?

  • for(i = n; i < n; i++)(l. 53) ここでは繰り返しはありません...

次のコードは期待どおりに機能します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* TODO: Avoid global variables. */
struct data *struct_array;

struct data {
    char inputA[20];
    char inputB[20];
};

/* 
 * TODO: Try to avoid passing your structure (40 bytes + padding) 
 * without pointer. 
 */
struct data get_data(void)
{
    struct data thisdata;

    printf("Please enter input A\n");

    /* TODO: Avoid using `scanf` for human inputs. */
    scanf("%s", thisdata.inputA);

    printf("Please enter input B\n");
    scanf("%s", thisdata.inputB);

    return thisdata;
}

void Output(size_t n)
{
    size_t i;
    for (i = 0; i < n; i++) {
        printf("%s ", struct_array[i].inputA);
        printf("%s ", struct_array[i].inputB);
    }
}

void resizeArray(size_t n)
{
    /* TODO: Handle reallocations errors. */
    struct_array = realloc(struct_array, n * sizeof *struct_array);
}

void mainMenu(void)
{
    size_t i, n;
    int p;

    /* TODO: Use a loop ? */
    printf("Please select from the following options:\n");
    printf("1: Add new students to database\n");
    printf("2: Display current student database contents\n");
    printf("3: exit the program\n");
    scanf("%d", &p);

    switch (p) {
    case 1:
        printf("Please enter the number of students to register:\n");
        scanf("%u", &n);
        resizeArray(n);

        for (i = 0; i < n; i++)
            struct_array[i] = get_data();
        break;
    case 2:
        Output(n);
        break;
    }
}

int main(void)
{
    struct_array = malloc(2 * sizeof(int));
    mainMenu();
    free(struct_array);
    return 0;
}
于 2012-10-20T17:08:29.530 に答える
2

typedefの使い方を知っていますか?

私はそれをお勧めします。コードが理解しやすくなり、構造体という単語を何千回も入力する必要がなくなります。また、新しい型をプリミティブ型 (int、chars など) と同様に扱うこともできますが、ドット (.) を使用して必要な個々のフィールドにアクセスすることを忘れないでください。

たとえば、次のように入力できます。

    typedef struct{
      char inputA[20];
      char inputB[20];
    } data;

これで、次のように変数を宣言できます。

   data data_variable;
   data *pointer_to_data;

そして、次のようにメモリを割り当てることができます:

   pointer_to_data = (data*) malloc(sizeof(data)* N);

ここで、N は割り当てたい構造体データの量です。realloc についても同じように機能します。

于 2012-10-20T19:52:30.790 に答える
0

struct_array = (int*)realloc(2*sizeof(int));

上記のステートメントにより、 int のアドレスを type のポインターに割り当てようとしていますstruct data

以下を使用する必要があります。

struct_array = (struct data*)realloc(2*sizeof(struct data));
于 2012-10-20T17:09:46.443 に答える