【问题标题】:Access variables in C structures访问 C 结构中的变量
【发布时间】:2009-11-16 17:03:05
【问题描述】:

我对C编程不是太熟悉,我对源代码做了一些修改,问题出在:
我在头文件中有这个:

typedef 结构 单词 { 长长的; 浮重; } 单词;

typedef 结构 向量 { 单词 *单词; 双重规范; } 向量;

在我的 file.c 中,我有一个类似的功能 双功能(SVECTOR *a,SVECTOR *b){ }

我应该如何在我的函数中访问 wnum 和 weight 变量???
在此先感谢 ;)

【问题讨论】:

  • 提醒一下,不要命名结构字。这是 unsigned short 的常见#define。很久以前,两个字节被称为 WORD。它是库代码中的常见定义,尤其是 Windows 代码。

标签: c function struct typedef


【解决方案1】:

你经过:

a->words->wnum
a->words->weight

或者:

a->words[SUBINDEX].wnum
a->words[SUBINDEX].weight

取决于您收到的函数的实际参数。

  1. 如果您收到指向单个 SVECTOR 元素的指针,则可以使用第一种方法。
  2. 另一方面,如果您收到指向服务器 SVECTOR 元素的指针,您可能会发现第二种方法更方便。

【讨论】:

    【解决方案2】:

    一定要检查空指针,但通常是:

    a->words->wnum
    a->words->weight
    

    因为它被称为单词,它听起来可能是一个数组(请检查代码以确保)。您可能需要遍历数组。如果您可以显示更多代码或指向一些文档,我们可以确定该数组的大小。

    for( unsigned int t = 0; t < [SIZE OF words ARRAY]; ++t )
    {
       a->words[t].wnum;
       a->words[t].weight;
    }
    

    【讨论】:

    • a 和 words 都可能是指向数组的指针,我们无法从我们看到的代码中分辨出来。
    • 当然,我认为它是一个数组......但我没有得到你的 for 循环??
    • 添加了一些 cmets 并明确检查 w 与 0 (NULL)
    • Ummm - 如果 words 是 WORD **,您的循环将起作用。因为这是你的意志,直到你出现段错误。 a->words 指向一块足够大的内存,可以容纳一个或多个 WORD 结构。 ++w 将 w 增加 sizeof(WORD)。我们怎么会是 0?
    • @sdtom。好点子。暂时要删除该代码。 @jamel 你能说明单词是如何分配的吗?
    【解决方案3】:

    a-&gt;words-&gt;wnum

    -&gt; 都取消引用指针并允许您引用结构的字段。

    【讨论】:

      【解决方案4】:

      根据名称 SVECTOR 和单词,听起来您正在处理数组。以下是一些变化:

      /**
       * a and words are meant to be treated as arrays
       */
      a[i].words[j].wnum = ...;
      a[i].words[j].weight = ...;
      /**
       * a is treated as an array, words is not
       */
      a[i].words->wnum = ...;
      a[i].words->weight = ...;
      /**
       * a is not treated as an array, words is
       */
      a->words[j].wnum = ...;
      a->words[j].weight = ...;
      /**
       * a and words are not treated as arrays
       */
      a->words->wnum = ...;
      a->words->weight = ...;
      

      那么为什么在应用下标时使用. 而在不应用下标时使用-&gt;?首先,请记住,通过指针访问结构成员时使用-&gt;,通过结构实例访问成员时使用.。数组下标操作定义为a[i] == *(a + i);下标的行为有效地取消了指针的引用。因此,words 的类型是struct word *(指向结构字的指针),words[i] 的类型是struct word。所以我们需要对前者使用-&gt;,对后者使用.ab 也是同样的道理。

      IF abwords 被视为数组,它们的大小必须在某个地方知道。

      【讨论】:

      • 我认为 words 是一个数组。你知道一种方法来获取它的大小以便我可以循环它吗?
      • 根据您发布的代码,没有。 words 指针不携带有关它指向的块大小的任何信息。鉴于您发布的内容,很可能存在保存该信息的全局变量或宏定义,但最好询问知道该代码应该如何工作的人。
      【解决方案5】:

      编辑:(添加了words,我错过了有两个嵌套结构的事实,我急于解释各种deferencing operator...)
      即原始回复就像 some_long_var = a-&gt;wNum; 这当然是错误的......

      第二次尝试 ;-)

      some_long_var = a->words->wNum;
      //  or
      some_float_var = a->words->weight;
      

      应该可以解决问题。

      由于 a 和 b 是指针,因此需要先解除对它们的引用,然后才能访问它们的成员。 -> 操作符同时做这两件事。

      或者你可以做类似的事情

      some_long_var = a[0].words->wNum;
      

      (或者如果您希望 a 是一个数组,则下标可能值大于 0)。关键是在 C 中,数组通常被“视为”指向数组中元素类型的指针,因此 [] 数组运算符可以是功能上且通常语义上正确的方法取消引用指针。

      最后,但这更做作(但对于推动对各种 c 运算符背后的语义的理解很有用),您可以分两步执行此操作,其中 * 运算符执行取消引用,成员运算符 (.) 得到所需的结构/类成员:

      some_long_var = (*a).words->wNum;
      

      【讨论】:

      • 其实,没有。 a 变量是指向SVECTOR 的指针,而不是WORD。正如 Heinzi 所示,您需要通过其 words 字段进行间接传递。
      【解决方案6】:

      你有一个指向 WORD 定义类型的指针,所以:

      a->words->(member)
      

      如果你只是有一个非指针成员,你应该这样做:

      a->words.(member) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        相关资源
        最近更新 更多