C中的结构数组参数

时间:2015-03-04 22:13:46

标签: c arrays pointers structure

我对C很陌生,现在正在上课并且在项目上遇到困难。我们在这个项目中有一个名为Symbol的结构。我们在这个项目中也有一个名为Node的结构。节点有一系列符号。我试图做的就是将属性Node.symbols设置为另一个符号数组,如下所示:

   int max = 256;
   Symbol symbols[max];
   Node node1;
   node1.syms = symbols;

错误:比较&#struct结构符号[256]'时出现不兼容类型来自类型'结构符号*'

我真的不明白为什么它认为符号是一个指针,当它看起来像一个符号数组给我。这可能是非常明显的,但我还没能解决它。

3 个答案:

答案 0 :(得分:3)

您不能将赋值运算符=用于数组。你要么必须使用循环:

for (int i = 0; i < max; ++i)
{
    node1.syms[i] = symbols[i];
}

或使用memcpy:

memcpy(node1.syms, symbols, max * sizeof(symbols[0]));

BTW,max是用于数组维度的错误名称(或其他任何内容),因为它与max()函数/宏的名称冲突。

答案 1 :(得分:1)

您没有发布NodeSymbol的定义,但我认为Node.syms是一个数组。在这种情况下,问题是在行node1.syms = symbols;中你尝试更改sysm结构的Node成员但是它是一个常量变量(每个数组都是常量,你不能改变它位置)。

你必须有可能。

1。)您将目标数组中的元素复制到syms数组:

int numelem = 256;
for (int i = 0; i < numelem; i++)
{
    node1.syms[i] = symbols[i];
}

但找出numelem变量的完美价值非常重要。即,无法检查node1.symssymbols数组是否具有相同数量的元素。如果它们的长度不相等,你可以超过其中一个来解决非法存储区域。另一个可能的缺点是,在Node个元素中,syms数组将具有相同数量的元素,您只能在编译时更改它。

2。)如果Node结构:

,则更改定义
struct Node {
   //...
   struct Symbol *syms;
   //...
}

在这种情况下,您的代码将被编译,并且数组node1.syms将指向数组symbol,您不必关心数组的长度。但重要的是,在这种情况下,内存中只有一个数组!因此,您必须考虑到数组通常在堆栈上分配,这意味着在从创建数组的方法退出之后,数组的内存空间也将被释放。如果您创建node1也是方法(如您的示例中所示),这很好。但是如果你创建node1作为全局变量,那么symbols数组也必须是全局变量。一般来说,我们可以说两个变量都必须在同一范围内创建。

答案 2 :(得分:0)

符号是一个指针。它是数组符号[256]的头部,类型为Symbol *。通过[]取消引用然后为每个增量添加sizeof(符号),例如符号[3]在地址符号+ 3 * sizeof(符号)

中引用数组中的第4个元素

使用指针的[]比执行显式指针算术更安全