C语言中的动态结构数组

时间:2012-10-20 17:02:58

标签: c arrays dynamic struct

我试图在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 个答案:

答案 0 :(得分:5)

您的源代码中有几个错误:

  • struct *struct_array;(l.5)
    这是什么意思?你想写struct data *struct_array吗?

  • printf("%s ", struct_array[i].inputA);(l.32&amp; 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;
}

答案 1 :(得分:4)

您的定义

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;

P.S。如果您每次使用struct类型时都不想键入data关键字,请使用typedef

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

答案 2 :(得分:2)

你知道如何使用typedef吗?

我会建议它,让你的代码更容易理解,你不必键入struct一千次。您也可以将新类型视为与原始类型(整数,字符等)类似,只是不要忘记使用点(。)来访问您可能想要的各个字段。

您可以输入例如:

    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是您要分配的struct数据量。同样适用于realloc。

答案 3 :(得分:0)

  

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

通过上面的语句,您试图将int的地址分配给类型为struct data的指针。

您需要使用:

struct_array = (struct data*)realloc(2*sizeof(struct data));