c - c 中具有常量参数的结构体数组

标签 c arrays struct constants

我定义了以下结构

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/

相关文章:

ios - 尝试创建具有预定义图像的结构实例。不确定结构或实例代码是否关闭

c++ - 'int [0]' c++ 的初始值设定项太多

有人可以帮我完成管道上的这项作业吗?

c - 返回一个指针,该指针是本地声明的 wchar_t

c - 删除C中字符串中的相邻重复项

java - 如何从Java中的并行数组中删除重复项?

c - 在 C 中逐步填充数组的最佳方法是什么?

c - 系统函数和堆栈

c++ - 字符串数组 C++ 的段错误

c - linux/list.h 中 container_of 宏背后的基本原理