我对C很陌生,现在正在上课并且在项目上遇到困难。我们在这个项目中有一个名为Symbol的结构。我们在这个项目中也有一个名为Node的结构。节点有一系列符号。我试图做的就是将属性Node.symbols设置为另一个符号数组,如下所示:
int max = 256;
Symbol symbols[max];
Node node1;
node1.syms = symbols;
错误:比较&#struct结构符号[256]'时出现不兼容类型来自类型'结构符号*'
我真的不明白为什么它认为符号是一个指针,当它看起来像一个符号数组给我。这可能是非常明显的,但我还没能解决它。
答案 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)
您没有发布Node
和Symbol
的定义,但我认为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.syms
和symbols
数组是否具有相同数量的元素。如果它们的长度不相等,你可以超过其中一个来解决非法存储区域。另一个可能的缺点是,在Node
个元素中,syms
数组将具有相同数量的元素,您只能在编译时更改它。
2。)如果Node
结构:
struct Node {
//...
struct Symbol *syms;
//...
}
在这种情况下,您的代码将被编译,并且数组node1.syms
将指向数组symbol
,您不必关心数组的长度。但重要的是,在这种情况下,内存中只有一个数组!因此,您必须考虑到数组通常在堆栈上分配,这意味着在从创建数组的方法退出之后,数组的内存空间也将被释放。如果您创建node1
也是方法(如您的示例中所示),这很好。但是如果你创建node1
作为全局变量,那么symbols
数组也必须是全局变量。一般来说,我们可以说两个变量都必须在同一范围内创建。
答案 2 :(得分:0)
符号是一个指针。它是数组符号[256]的头部,类型为Symbol *。通过[]取消引用然后为每个增量添加sizeof(符号),例如符号[3]在地址符号+ 3 * sizeof(符号)
中引用数组中的第4个元素使用指针的[]比执行显式指针算术更安全