我定义了以下结构
typedef const struct _txmlAttribute
{
const char * const ns;
} txmlAttribute;
在下面的函数中我想初始化我的结构的动态数组:
int func(txmlAttribute* attrs){
attrs = (txmlAttribute*) { {"as"}, {"bs"}};
return 0;
}
int main(){
txmlAttribute* attrs;
func(attrs);
return 0;
}
但我收到这些警告:
main.c: In function ‘func’:
main.c:13:5: warning: braces around scalar initializer [enabled by default]
attrs = (txmlAttribute*) { {"as"}, {"bs"}};
^
main.c:13:5: warning: (near initialization for ‘(anonymous)’) [enabled by default]
main.c:13:5: warning: initialization from incompatible pointer type [enabled by default]
main.c:13:5: warning: (near initialization for ‘(anonymous)’) [enabled by default]
main.c:13:5: warning: braces around scalar initializer [enabled by default]
main.c:13:5: warning: (near initialization for ‘(anonymous)’) [enabled by default]
main.c:13:5: warning: initialization from incompatible pointer type [enabled by default]
main.c:13:5: warning: (near initialization for ‘(anonymous)’) [enabled by default]
main.c:13:5: warning: excess elements in scalar initializer [enabled by default]
main.c:13:5: warning: (near initialization for ‘(anonymous)’) [enabled by default]
那么这是为什么呢?我怎样才能清除它?
最佳答案
您的问题是 {{"as"}, {"bs"}}
将在堆栈上分配,并且在您离开函数范围后将变得无效*。
我会通过编写一个“构造函数”函数来实现这一点,该函数将字段作为参数,为结构及其成员分配(malloc)所需的空间,初始化它们并返回指向该结构的指针。那么填充数组的代码将类似于:
txmlAttribute attrs[2];
attrs[0] = make_txml_attr("as");
attrs[1] = make_txml_attr("bs");
txmlAttribute * make_txml_attr(const char * val) {
txmlAttribute * res = malloc(sizeof(txmlAttribute));
res->ns = strdup(val);
return res;
}
void free_txml_attr(const char ** p_attr) {
free(*p_attr->ns);
free(*p_attr);
*p_attr = NULL;
}
(我省略了错误检查)
--
无效 - 因为访问它将是未定义的行为
关于c - c 中具有常量参数的结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613397/