C语言 C中的动态结构数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12990723/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 04:10:49  来源:igfitidea点击:

dynamic array of structs in C

carraysdynamicstruct

提问by cHam

I am trying to learn about structs, pointers, and dynamic arrays in C. I don't understand how to create a dynamic array of structs using pointers. My code doesn't work, and I don't know what's wrong with it. I have seen several examples of dynamic arrays, but non with structs. Any help would be appreciated. Please give some explanation, not just code snippets as I do want to understand not just solve this problem.

我正在尝试学习 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();
}

采纳答案by md5

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_arraymasks 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 mallocinstead? 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 indexis not used. Why did you declare it?

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

  • 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) 你不会在这里有任何迭代......

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

回答by Viktor Latypov

Your definition

你的定义

struct *struct_array;

is erroneous. You must use the name of your type, the data.

是错误的。您必须使用类型的名称,即data.

struct data *struct_array;

This way you can allocate the array

这样你就可以分配数组

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

and later you should free the memory

然后你应该释放内存

free(struct_array);

EDIT: Type definition must occur before the var declaration.

编辑:类型定义必须出现在 var 声明之前。

struct data ....

struct data* your_variable;

P.S. If you do not want to type structkeyword each time you use the datatype, use the typedef:

PS 如果不想struct每次使用data类型都输入关键字,请使用typedef

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

回答by vmp

Do you know how to use typedef?

你知道如何使用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.

我建议这样做,使您的代码更容易理解,而且您不必输入 struct 一词一千次。您也可以将新类型与原始类型(整数、字符等)相似,只是不要忘记使用点 (.) 来访问您可能需要的各个字段。

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.

其中 N 是您要分配的结构数据量。同样适用于 realloc。

回答by akaHuman

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

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.

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

You need to use:

您需要使用:

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