我想通过以下方式定义结构:
typedef struct Info_s
{
uint8 Size;
uint8 Address;
uint8 Pattern[Size];
}Info_t;
您可以注意到数组Pattern的大小是“Size”,它在同一结构中首先声明。
这是对的吗?
答案 0 :(得分:6)
声明为struct字段的数组必须具有整数常量表达式作为其大小,或者是灵活的数组成员,没有大小(uint8 Pattern[];
) 。你的变体既不是。
如果您的案例中的数组大小是运行时值,则有两个选择
灵活的阵列成员uint8 Pattern[];
,这将导致"平坦"结构。用于容纳具有所需长度数组的整个结构的适当内存量必须手动分配malloc
。
指针成员uint8 *Pattern;
,在这种情况下,您的结构将变为两层。结构本身的内存和数组的内存通常会成为独立分配的两个独立的内存块。
灵活的数组成员通常是一个更好的主意(并且与您明显的原始意图相匹配),除非您有一些其他要求可以排除这种情况。
答案 1 :(得分:2)
你不能这样做。这违反了规则。编译代码,你就会清楚地知道它。
而是保留 $users = ["Tom", "Bob"];
foreach( $users as $user) {
$leads->orWhereRaw("JSON_CONTAINS(user, ?)", [$user]);
}
$leads = $leads->get();
,然后根据uint8*
的值为其分配内存(使用malloc
,realloc
等)。
现在,如果您根据重新分配记忆而增加或减少价值Size
。
是的,使用它时必须释放动态分配的内存。
答案 2 :(得分:2)
只需删除Size
声明中的数组大小Pattern
,您将获得具有灵活数组成员的结构的有效声明。:)
typedef struct Info_s
{
uint8 Size;
uint8 Address;
uint8 Pattern[];
}Info_t;
答案 3 :(得分:1)
使用
uint8* Pattern;
并在知道malloc
后使用Size
分配其大小。
答案 4 :(得分:1)
如果要为结构动态分配内存,可以按以下方式执行:
struct Info_s
{
uint8 Address;
uint8 Pattern[Size];
};
int main()
{
struct Info_s *no;
int i, noOfRecords;
printf("Enter no: ");
scanf("%d", &noOfRecords);
no=(struct Info_s*) malloc (noOfRecords * sizeof(struct course));
for(i=0;i<noOfRecords;++i)
{
scanf(...);
}
.
.
.
return 0;
}
您还可以参考https://www.programiz.com/c-programming/examples/structure-dynamic-memory-allocation了解详情。