将指向同一类型结构体成员的指针分配给另一个指向同一类型结构体的指针

2023-11-29

即使对我来说,这个问题听起来也非常令人困惑,而且它可能看起来很明显或已经得到解答,但我已经搜索了很多,虽然我发现了有趣的东西,但我没有找到完全适合我的问题的答案。这是一些C代码将更好地显示我的疑问:

typedef struct Node_struct {
   char keyLine[100];
   int occurrences;
   struct Node* leftChild;
   struct Node* rightChild;
   struct Node* parent;
} Node;

typedef struct Tree_struct {
   Node* root;
} Tree;

int insertNode(Tree* myTree, Node* newNode) {
    ...
    Node* currentNode = myTree->root;
    ...
    if (caseSenCmpString(newNode->keyLine, currentNode->keyLine) == -1) {
        currentNode = (Node*)currentNode->leftChild;
    }
    ...
 }

这段代码正确吗?自从currentNode属于类型Node*, and currentNode->leftChild属于类型struct Node*,我不得不投(Node*)currentNode->leftChild这样它就可以被分配给currentNode。但我不确定这是否正确、必要,或者是否有更好的方法来做同样的事情。

同样,我也有这个:

Node* coverNode = NULL;
...
coverNode->leftChild = (struct Node*)newNode;

应该写什么

假设问题中的代码是这样写的:

typedef struct Node {     // Not Node_struct as in the question!
   char keyLine[100];
   int occurrences;
   struct Node* leftChild;
   struct Node* rightChild;
   struct Node* parent;
} Node;

然后是名字Node将是同义词(别名)struct Node。 (对于任何typedef X Y;, Y成为类型的同义词X- 在你的情况下,X将会struct Node and Y将是节点。)

演员阵容:

currentNode = (Node *)currentNode->leftChild;

是不必要的(但大多是无害的),因为这将是一个空操作 - 类型struct Node * and Node *将是同一指针类型的两个名称。同样对于:

coverNode->leftChild = (struct Node *)newNode;

演员阵容是不必要的,但(大部分)是无害的。存在将人们与演员混淆的小风险。最好尽可能避免强制转换,并且在没有强制转换的情况下编写这些会更好:

currentNode = currentNode->leftChild;
coverNode->leftChild = newNode;

写的是什么

typedef struct Node_struct {
   char keyLine[100];
   int occurrences;
   struct Node* leftChild;
   struct Node* rightChild;
   struct Node* parent;
} Node;

现在我们有三个类型名称:struct Node_struct, struct Node, and Node。在这种情况下,struct Node_struct and Node是同义词,并且struct Node是不完整的结构类型(或者至少,它没有由问题中的任何代码完成)。它与任何一个都完全无关struct Node_struct or Node除了巧合的是它在结构内部被引用。

使用这种表示法,强制转换是“必要的”,因为您要在指向不相关类型的指针之间进行转换(struct Node * and struct Node_struct *)。幸运的是,有一些规则规定所有结构类型指针都是可相互转换的,并且必须具有相同的大小和对齐要求(C11§6.2.5 类型 ¶28 and §6.3.2.3 指针 ¶7).

但你应该放弃_struct部分Node_struct使本答案第一部分的规则适用。在 C 中,(IMO)使用以下命令是明智的:

typedef struct SomeTag SomeTag;

以便您随后可以使用SomeTag *等等第一个SomeTag位于标签命名空间中并且与第二个不冲突SomeTag,它位于普通标识符名称空间中。见C11§6.2.3 标识符的命名空间.

也可以看看:

  • C 标准的哪一部分允许编译此代码?
  • C标准是否认为存在一两个struct uperms_entry在这段代码中输入?
  • C 风格/C++ 正确性 — 是struct, union, enum与类型名称相同的标签有什么不好的吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将指向同一类型结构体成员的指针分配给另一个指向同一类型结构体的指针 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • json 文件的 $http.get 总是返回 404

    我想向我的应用程序添加一个配置 JSON 文件 我已将其添加到我的项目中并尝试使用 http get 获取它 http get http localhost myProject content json success function d
  • 低音音频库开/关按钮

    在此示例中如何创建开 关音乐按钮 在 Inno Setup 安装期间播放声音 我想使用 image png 以下脚本创建一个按钮 您可以通过该按钮根据流的当前状态播放或暂停流 Setup AppName Bass Audio Project
  • 子状态机

    我有一个有 5 个州的 FSM 其中3个是通过子FSM UML模式 设计的 对于 VHDL 中的实现 恕我直言 有两种方法可以做到这一点 将它们总结为一个 这样我就有了一份包含子 FSM 的文档和一个包含一个大 FSM 的产品 与所有州建立
  • 确定 SPA 和 .NET Core 3 的角色

    我有一个使用 NET Core 3 1 的应用程序 还有一个使用由此生成的默认 React 应用程序的前端link 在 NET Core 应用程序中 我使用用户和角色设置了 Identity Server 当我使用 React 应用程序时
  • 如何迭代字典?

    我见过几种在 C 中迭代 字典的不同方法 有标准的方法吗 foreach KeyValuePair
  • 当我使用会话将值从一个页面发送到另一个页面时,出现以下错误[重复]

    这个问题在这里已经有答案了 警告 session start 打开 var cpanel php sessions ea php56 sess c84fdb91458e26c7325faf74a529a3 O RDWR 失败 没有这样的文件
  • 获取perl字符串计算结果

    如果一个字符串如下所示 str 5 2 1 我想从该字符串中获取计算结果 如何转换为标量来计算它 谢谢 最简单的方法是 print eval 5 2 1 但这并不安全 print eval print You are hacked 您需要先
  • Laravel - 使用 whereHas 获取最后一行

    我正在尝试获取上次用户活动的时间 created at 我有模型User and UserActivity 我想获取最后一个用户活动并检查该用户的最后一个活动是否是 3 天发送通知 User php
  • 忍者。对内部设置属性的奇怪拦截

    域对象 目标对象 cs public class TargetObject public virtual ChildTargetObject ChildTargetObject get return ChildTargetObjectInn
  • python: 为什么使用子进程调用 echo 会返回 WindowsError 2?

    在我的程序中 我有一个函数 runScript def runScript subprocess call echo hello 我在 Python 文档中看到过很多类似的例子 所以我认为这可行 但是 当我在程序中调用此函数时 它返回 Wi
  • 如何用C++实现“虚拟模板功能”

    首先 我已经阅读过并且现在知道虚拟模板成员函数在 C 中 还 不可能 解决方法是使类成为模板 然后在成员函数中也使用模板参数 但在 OOP 的背景下 我发现如果该类实际上是一个模板 下面的示例就不会很 自然 请注意 该代码实际上不起作用 但
  • 网页抓取 Pokemon 数据

    我试图找出每个神奇宝贝 第一代 可以学习的动作数量 我发现以下网站包含此信息 https pokemondb net pokedex game red blue yellow 这里列出了 151 个 Pokemon 对于每个 Pokemon
  • PHP mysqli_real_escape_string 返回空字符串

    如果我不使用 mysql real escape string 函数 代码可以正常工作 但该函数没有返回任何内容 我读到问题可能是由于我没有 mysql 连接 但情况似乎并非如此 请帮忙
  • shell函数中的“声明”和环境变量的范围

    考虑以下测试片段 这些是文件 declare test 的内容 function do foobar unset FOOBAR declare FOOBAR default FOOBAR override echo At end of do
  • 在 pandas 中生成唯一 ID 列

    我有一个包含三列的数据框 bins x bins y and z 我想添加一个新列unique这是该独特组合的某种 索引 bins x and bins y 以下是我想附加的示例 请注意 为了清楚起见 我对数据框进行了排序 但在此上下文中顺
  • ag-Grid - 在行悬停时显示按钮,就像 Gmail 中一样

    在 ag Grid 中 我想在悬停一行时显示操作按钮 就像在 Gmail 中一样 无论滚动位置如何 操作按钮都必须出现在网格的右端 有提到一种方法https blog ag grid com build email client with
  • 是否可以在for循环语句下完成所有ajax调用后运行代码?

    我有一个for循环语句 每个循环都会执行一个ajax调用 each arr function i v var url xml php id v ajax url url type GET dataType xml success funct
  • oracle数据库中的阿拉伯字符

    亲爱的大家 我正在努力做到以下几点 我想在我的数据库中存储阿拉伯字符 但问题是它们的存储方式是 我尝试过这些功能 msg txt convert msg txt AR8MSWIN1256 AR8ISO8859P6 但我得到了这个错误 ORA
  • Ubuntu 上的 PyXML

    我刚刚完成 Ubuntu 10 10 的全新安装 我正在尝试运行一些使用 xml 和 xpath 的脚本 我从 PyXML 内部收到错误 我认为这是一个安装错误 为了安装它 我执行了以下操作 prompt gt sudo apt get i
  • 将指向同一类型结构体成员的指针分配给另一个指向同一类型结构体的指针

    即使对我来说 这个问题听起来也非常令人困惑 而且它可能看起来很明显或已经得到解答 但我已经搜索了很多 虽然我发现了有趣的东西 但我没有找到完全适合我的问题的答案 这是一些C代码将更好地显示我的疑问 typedef struct Node s