【问题标题】:Structure Array arguments in CC中的结构数组参数
【发布时间】:2015-03-04 22:13:46
【问题描述】:

我对 C 语言很陌生,现在正在上课,但在项目上遇到了困难。我们在这个项目中有一个称为符号的结构。我们在这个项目中还有一个称为 Node.js 的结构。节点有一个符号数组。我要做的就是将属性 Node.symbols 设置为另一个符号数组,如下所示:

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

错误:比较“struct Symbol[256]”与“Struct Symbol *”类型时类型不兼容

我真的不明白为什么它认为符号是一个指针,而它对我来说似乎是一个符号数组。这可能很明显,但我无法修复它。

【问题讨论】:

  • 这意味着syms被声明为struct Symbol[256]。您需要一张一张地复制。仅供参考,symbols 也是指针。如果你不明白这一点,你最好先复习你的教科书。
  • symbols 不是指针它是一个数组,但在 C 数组中非常接近指针。你能在这里发布节点是如何定义的吗?如果 node1.syms 是一个指针,你只能做那个赋值。

标签: c arrays pointers structure


【解决方案1】:

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

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

或使用 memcpy:

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

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

【讨论】:

  • 非常感谢,我没有意识到这是 C 语言中的一个差异,并且错误是以这样一种方式编写的,以至于通过我关闭。看来我在基本 C 方面还有很多东西要学,感谢您的帮助
  • MAX 的预处理宏怎么样?
【解决方案2】:

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

你必须有各种可能性。

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 数组也必须是全局变量。一般来说,我们可以说两个变量必须在同一个范围内创建。

【讨论】:

    【解决方案3】:

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

    使用指针的 [] 比使用显式指针算法更安全

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2011-07-07
      相关资源
      最近更新 更多