在c中创建一个具有多个动态大小数组的结构?
是否可以在c中创建包含两个动态大小数组的结构 我有这样的想法:在c中创建一个具有多个动态大小数组的结构?,c,struct,C,Struct,是否可以在c中创建包含两个动态大小数组的结构 我有这样的想法: #define MAX_DATA 512 struct Address { int id; int set; char name[MAX_DATA]; char email[MAX_DATA]; }; #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int
#define MAX_DATA 512
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
#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);
}
我希望在运行时定义MAX_数据
我看过struct hack:
但我认为这只适用于每个结构的一个字段
此代码来自
该页面底部附近的额外积分部分包含关于将大小更改为动态的部分。您可以使用struct hack(现在称为灵活数组)来实现这一点。它只需要将两个数组打包到结构的灵活部分
假设您希望数组的长度分别为
N
和M
。然后分配一个灵活的数组,就像分配一个长度为N+M
的数组一样。然后对第一个数组使用索引0..N-1
,对第二个数组使用索引N..N+M-1
。您可以使用struct hack(现在称为灵活数组)来实现这一点。它只需要将两个数组打包到结构的灵活部分
假设您希望数组的长度分别为
N
和M
。然后分配一个灵活的数组,就像分配一个长度为N+M
的数组一样。然后对第一个数组使用索引0..N-1
,对第二个数组使用索引N..N+M-1
。您可以使用struct hack(现在称为灵活数组)来实现这一点。它只需要将两个数组打包到结构的灵活部分
假设您希望数组的长度分别为
N
和M
。然后分配一个灵活的数组,就像分配一个长度为N+M
的数组一样。然后对第一个数组使用索引0..N-1
,对第二个数组使用索引N..N+M-1
。您可以使用struct hack(现在称为灵活数组)来实现这一点。它只需要将两个数组打包到结构的灵活部分
假设您希望数组的长度分别为N
和M
。然后分配一个灵活的数组,就像分配一个长度为N+M
的数组一样。然后对第一个数组使用索引0..N-1
,对第二个数组使用索引N..N+M-1
。如果将struct Address
定义放在函数中,它会起作用(至少对于GCC 4.7.2),如下所示:
#define MAX_DATA 512
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
#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);
}
如果将struct Address
定义放在函数中,它会起作用(至少对于GCC 4.7.2),如下所示:
#define MAX_DATA 512
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
#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);
}
如果将struct Address
定义放在函数中,它会起作用(至少对于GCC 4.7.2),如下所示:
#define MAX_DATA 512
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
#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);
}
如果将struct Address
定义放在函数中,它会起作用(至少对于GCC 4.7.2),如下所示:
#define MAX_DATA 512
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
#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);
}
我曾经这样做过:
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
告诉我们
一个数组结束,另一个数组开始。我曾经这样做过:
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;
}
struct Address
{
int id;
int set;
char *name;
char *email;
};
因此数组th->Bytes
实际上包含两个“数组”,指针th->MoreBytes
告诉我们
一个数组结束,另一个数组开始。我曾经这样做过:
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;
}
struct Address
{
int id;
int set;
char *name;
char *email;
};
因此数组th->Bytes
实际上包含两个“数组”,指针th->MoreBytes
告诉我们
一个数组结束,另一个数组开始。我曾经这样做过:
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;
}
struct Address
{
int id;
int set;
char *name;
char *email;
};
因此数组th->Bytes
实际上包含两个“数组”,指针th->MoreBytes
告诉我们
其中一个数组结束,另一个数组开始
struct Address
{
int id;
int set;
char *name;
char *email;
};
现在在main()
函数中,使用一些变量,比如len
来存储数组的长度,并使用malloc()
动态分配所需的内存
否则,您可以添加len
作为struct Address
struct Address
{
int id;
int set;
int len;
char *name;
char *email;
};
现在进入main()
现在在main()
函数中,使用一些变量,比如len
来存储数组的长度,并使用malloc()
动态分配所需的内存
否则,您可以添加len
作为struct Address
struct Address
{
int id;
int set;
int len;
char *name;
char *email;
};
现在进入main()
现在在main()
函数中,使用一些变量,比如len
来存储数组的长度,并使用malloc()
动态分配所需的内存
否则,您可以添加len
作为struct Address
struct Address
{
int id;
int set;
int len;
char *name;
char *email;
};
现在进入main()
现在在main()
函数中,使用一些变量,比如len
来存储数组的长度,并使用malloc()
动态分配所需的内存
否则,您可以添加len
作为struct Address
struct Address
{
int id;
int set;
int len;
char *name;
char *email;
};
现在进入main()
当然,您只需将数组更改为指针,然后需要为每个动态大小的数组调用一次malloc。。我真的需要先阅读标记,我几乎是建议“使用std::vector”。这不是一个hack,但在标准中明确提到。它被称为flexible array member或zero-length array。如果你能减少损失,使用普通的malloc而不是struct hack,几年后当你维护代码时,你会为此感谢自己。@MattMcNabb我不知道“普通”malloc(即三个malloc)更容易维护。共享一个缓冲区的任何复杂性通常都可以封装在创建
Address
实例的函数中。使用一个缓冲区意味着可以使用普通的free()
释放地址。当然,您只需将数组更改为指针,然后需要为每个动态大小的数组调用一次malloc
。。我真的需要先读取标记,我几乎建议“使用std::vector”这不是一个黑客,但在标准中明确提到。这叫做柔性阵列