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每次使用data类型时都键入关键字,请使用typedef

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

You have several errors in your source code:

  • struct *struct_array; (l. 5)
    What does it mean? Did you want to write struct data *struct_array?

  • printf("%s ", struct_array[i].inputA); (l.32 & l. 33)
    The argument struct_array masks the global declaration, and it is not an array. Why did you add this argument?

  • struct_array = (int *)realloc(n * sizeof(int)); (l. 39)
    You have forgotten an argument. Did you want to use malloc instead? Besides, the cast is not necessary (and incorrect!).

  • Unless you are using an hosted environnment and C99/C11, you should return a value from main.

  • Your variable index is not used. Why did you declare it?

  • for(i = n; i < n; i++) (l. 53) You won't have any iteration here...

The following code works as expected.

#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

Do you know how to use typedef?

I would suggest it, makes your code easier to understand and you won't have to be typing the word struct a thousand times. Also you could treat the new type similar to the primitive types (ints, chars, etc), just don't forget to use the dot (.) to access the individual fields you might want.

You could type for instance:

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

Now you could declare variables like this:

   data data_variable;
   data *pointer_to_data;

And to you could allocate memory as follows:

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

where N is the amount of struct data you want to allocate. Same works for realloc.

于 2012-10-20T19:52:30.790 回答
0

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

By the above statement you are trying to assign address of an int to a pointer of type struct data.

You need to use:

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