在c中创建一个包含多个动态大小数组的结构?

时间:2014-04-10 10:24:36

标签: c struct

是否可以在c?

中创建包含两个动态大小数组的结构

我有这样的事情:

#define MAX_DATA 512

    struct Address {
    int id;
    int set;
    char name[MAX_DATA];
    char email[MAX_DATA];
};

我希望在运行时定义MAX_DATA。

我见过结构黑客:

How to include a dynamic array INSIDE a struct in C?

但我认为这只适用于每个结构的一个字段?

此代码来自http://c.learncodethehardway.org/book/ex17.html

该页面底部附近的额外信用部分包含有关将尺寸更改为动态的信息。

4 个答案:

答案 0 :(得分:3)

我曾经这样做过:

struct Thing {
    int Number;
    char *MoreBytes;
    char Bytes[]
}


Thing *MakeThing(int nBytes, int nMoreBytes) 
{
    Thing *th = malloc(sizeof(Thing) + nBytes + nMoreBytes);
    // Error checking is for grrrlz.

    th->Number = 42;
    th->MoreBytes = th->Bytes + nBytes; 

    return th;
}

因此数组th->Bytes实际上同时包含两个“数组”,指针th->MoreBytes告诉我们 其中一个数组结束而另一个数组开始。

答案 1 :(得分:0)

您可以使用struct hack(现在称为灵活数组)来执行此操作。它只需要您将两个数组打包到结构的灵活部分。

假设您希望数组分别为NM长度。然后分配一个灵活的数组,就像分配一个长度为N+M的数组一样。然后对第一个数组使用索引0..N-1,为第二个数组使用索引N..N+M-1

答案 2 :(得分:0)

如果你将struct Address定义放在一个函数中,它可以工作(至少对于GCC 4.7.2),如下所示:

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

int
main(int argc, char *argv[])
{
    int len = atoi(argv[1]);

    struct Address {
        int id;
        char name[len];
        int set;
        char email[len];
    };

    printf("sizeof(struct Address) = %zu\n", sizeof(struct Address));
    exit(EXIT_SUCCESS);
}

测试:

$ ./a.out 10
sizeof(struct Address) = 32
$ ./a.out 20
sizeof(struct Address) = 48

答案 3 :(得分:0)

struct Address 
{
int id;
int set;
char *name;
char *email;
};

现在在main()函数中,使用一些变量,让我们说len来存储数组的长度,并使用malloc()动态分配所需的内存。

int len;
struct Address Add;
printf("Enter the lenght of the array you want?");
scanf("%d",&len);
Add.name=(char *)malloc(len); 
Add.email=(char *)malloc(len);

否则您可以添加len作为struct Address

的成员
struct Address 
{
int id;
int set;
int len;
char *name;
char *email;
};

现在在main()

struct Address Add;
printf("Enter the lenght of the array you want?");
scanf("%d",&Add.len);
Add.name=(char *)malloc(Add.len); 
Add.email=(char *)malloc(Add.len);