【发布时间】:2011-07-25 14:56:48
【问题描述】:
我使用这段代码已经有一段时间了,它运行良好,但实现它让我有些头疼。它使用灵活数组成员 (FAM) 又名 Struct Hack。既然 C99 有可能使用可变长度数组 (VLA),我想知道如何在这篇文章中发挥优势?
typedef struct nO
{
int oper; /* some operator */
int nops; /* number of args */
struct nO *ptn[1]; /* expansible array <=== HERE */
} nodoOper;
nodoOper *operator(int o, int n, ...)
{
va_list ap;
nodoOper *tn;
size_t tam;
int i;
tam = sizeof(nodoOper) + (n - 1) * sizeof(nodoOper *); /* <=== AND HERE */
if((tn=malloc(tam))==NULL)
yyerror("Memory fault (cod. 4)");
tn->oper = o;
tn->nops = n;
va_start(ap, n);
for(i=0; i<n; i++)
tn->ptn[i] = va_arg(ap, nodoOper*);
va_end(ap);
return tn;
}
(我在这里简化了整个结构和代码,因为它使用了另外两个对问题不重要的结构,所以这个例子可能有错误)
现在,结构定义位于头文件 (.h) 中,代码为编译器创建语法树。如何更改数组以使用可变长度?
谢谢! 贝科。
已编辑:将上次编辑回滚到灵活数组成员。
第二版。假设我在函数内部添加了这段代码:
struct nOp
{
int oper; /* some operator */
int nops; /* number of args */
struct nOp *ptn[n]; /* Variable Length Array (VLA) */
};
struct nOp tnop;
struct nOp *tn2;
tn2 = &tnop;
return tn2;
我看到的第一个问题,我正在返回一个指向局部变量的指针。但除此之外,这条路是否硕果累累? 谢谢
【问题讨论】:
-
现在我了解到 Flexible Array Member (FAM) 是 Struct Hack 的同义词,并且我已经这样做了,我很清楚这个问题的目的是找到使用 C99 给我们的另一个工具的另一种方法称为可变长度数组 (VLA)。如果这不可能,那么……好吧,我们保留已经实施的旧方法。
-
如果您决定保留“旧方式”,您可以考虑使用
offsetof(nodoOper, ptn) + n * sizeof(nodoOper *)来计算大小。这样你就不需要记住减去1。这样你就完全不依赖于数组声明中[]之间指定的内容。