是否可以在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
该页面底部附近的额外信用部分包含有关将尺寸更改为动态的信息。
答案 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(现在称为灵活数组)来执行此操作。它只需要您将两个数组打包到结构的灵活部分。
假设您希望数组分别为N
和M
长度。然后分配一个灵活的数组,就像分配一个长度为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);