C Treenode 指针通过全局变量改变值

2024-06-18

所以,这就是故事。我正在尝试创建一个递归下降解析器,该解析器对字符串进行标记,然后从这些标记中创建一棵节点树。

我的主要课程的所有指针都在工作...如果您之前使用过 RDP,那么您知道我在谈论程序 -> 语句 -> allocateStmt... 等等。这个想法是该程序节点有一个指向语句节点的子节点,等等。

问题就在这里。当我到达树节点的末尾时,我指向标记生成器从字符串创建的实际标记。

所以,假设该字符串是:

 firstvar = 1;

在本例中,有 4 个标记 [{id} firstvar]、[{assignment} =]、[{number} 1]、[{scolon}]

我希望我的 allocateStmt 节点指向该语句的非装饰器部分。即,assignStmt 的 child1 将为 [{id} firstvar],child2 将为 [{number} 1]...

然而。当我将 child1 分配给 [{id} firstvar],然后继续移动到下一个标记时,child1 的值会随着我的移动而改变。因此,如果我将全局令牌更改为下一个令牌(在本例中为 [{assignment} =] ),则 allocateStmt 的 child1 也会随之更改。

为什么是这样?我能做些什么?!谢谢你!

TOKEN* getNextToken(void); 
//only shown here to you know the return... it's working properly elsewhere

typedef struct node {
    TOKEN *data;

    struct node *child1, *child2, *child3, *child4, *parent;

} node;

TOKEN *token;
Symbol sym;
struct node *root;

void getsym() 
{
    token = getNextToken();
    sym = token->sym;
}

int main()
{
    getsym();
    //So, right now, from getsym() the global token has the value {identifier; firstvar} 

    struct node* tempNode;
    tempNode = (struct node*) calloc(1, sizeof(struct node));
    tempNode->child1 = tempNode->child2 = tempNode->child3 = tempNode->child4 =  NULL;
    tempNode->data = token;

    getsym();
    //BUT NOW from getsym() the global token has the value {assignment; =}, and 
    //subsequently the tempNode->data has changed from what it should be 
    //{identifier; firstvar} to what the global token's new value is: {assignment; =}

}

由于我的声誉较低,我无法对此发表评论,因此我将添加这个答案,如果理解了您的问题,您可能正在传递一个指向函数的指针,问题是您可能需要一个指向指针的指针,而不仅仅是一个指针。

在 C 中,当您将值传递给函数时,您是按值传递它们,而不是按引用传递它们,这意味着该函数会创建该参数的本地副本,并且它仅适用于该本地副本,问题是所有更改都会影响如果您不正确处理此问题,则只有本地副本,并且当函数终止时,所有更改都将丢失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C Treenode 指针通过全局变量改变值 的相关文章

  • 如何重写实体数据模型创建的对象上的 Equals?

    我创建了一个实体数据模型 它从 SQLite 数据库中提取记录 其中一个表是 People 我想重写 person Equals 方法 但我不确定去哪里进行这样的更改 因为 Person 对象是自动生成的 我什至看不到该 autogen 代
  • 遍历后加快数组查找速度?

    我有一个123MB大的int数组 它基本上是这样使用的 private static int data new int 32487834 static int eval int c int p data c 0 p data p c 1 p
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 具有可导出私钥的证书的“错误密钥”例外

    我正在尝试使用非对称加密来加密然后解密文件 我已经使用 makecert 创建了一个测试证书并将其安装到我的个人本地计算机存储中 将来我必须在多个服务器上安装此证书 这就是为什么我使用 pe 标志创建它 即使用可导出的私钥 证书已成功创建并
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws

随机推荐

  • 致命错误:PHP 从版本 7.0 升级到 7.2 后找不到类“SoapClient”

    我升级了PHP 7 0 to 7 2在Ubuntu中 执行升级后 我安装了 Laravel 5 6 升级之前 类 SoapClient 是true 但是升级之后 我遇到了 致命错误 未找到 SoapClient 类 我检查了php ini
  • 对象检测 ARKit 与 CoreML

    我正在建设ARKitiPhone 的应用程序 我需要检测特定的香水瓶并根据检测到的内容显示内容 我使用来自developer apple com的演示应用程序来扫描现实世界的对象并导出 arobject我可以在资产中使用的文件 它工作正常
  • 从asp.net ListBox中获取所有选定的项目

    任何人都知道一个顺利的方法来获得所有selected使用扩展方法在列表框控件中的项目 并且 请不要让我争论与如何获取这样一个列表无关 因为最终一切都使用循环来迭代项目并找到选定的项目 var selected yourListBox Ite
  • Javascript - window.getCompulatedStyle 返回“auto”作为元素顶部和左侧属性

    在我的网页上 我有一些元素 div 子 div 按钮等 其位置是相对于它们所在的 div 以及彼此之间生成的 这会导致使用时的结果window getCompatedStyle the top and left属性不是数字值 而是简单的 a
  • 等待两个异步函数完成,然后在 Node.js 中继续

    我正在 Node js 中开发一个应用程序 其中调用异步函数两次 并将值分配给全局变量 问题是我想使用这两个调用的结果来做其他事情 但是这个其他事情不会等待结果被分配 这是我的代码 var a var b let x abcd foo x
  • 在 Java 中对多语言环境字符串进行排序

    我正在尝试按字符串字段 国家 地区 对对象列表进行排序 每个国家 地区都使用其母语 阿根廷 澳大利亚 奥地利 例如 我想要做的是让 出现在 A 国家之后 因为字母 对应于拉丁语 B 我正在尝试使用默认的 Collat er 但非拉丁名称仍然
  • php 无法连接到 mysql,错误为 13(但命令行可以)

    我在新安装的服务器中遇到了奇怪的情况 谷歌这次似乎无法帮助我 我无法从我的 php 代码连接到 远程 mysql 当我尝试从同一服务器上的命令行连接时 连接成功 无法连接 无法连接到 MYSQL SERVER 上的 MySQL 服务器 13
  • Spring 应用程序启动前的 Spring Boot 设置日志记录

    我有一个项目 在启动 SpringApplication 之前需要日志记录机制 我怎样才能做到这一点 我尝试设置自己的日志记录机制 LogManager getLogManager readConfiguration 但在 Spring 应
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • time.sleep - TypeError:需要一个浮点[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 time sleep 2 TypeError a float is required 我该如何解决 我不确定我应该在这里做什么 您
  • Java 应用程序可以检测到调试器已连接吗?

    我知道 jvm 启动选项可以让 jvm 等待附加调试器 这不是我在这里的意思 是否有可能从 Java 代码中也检测调试器的附件 以便我可以例如编写一个正在执行某些操作的 脚本 然后在某个时刻让我的应用程序等待调试器 不会 这些选项是 JVM
  • SPF 问题:软故障的原因是什么?

    每当我使用 PHP 向网站成员发送电子邮件时 该电子邮件最终都会进入大多数电子邮件提供商 例如 Gmail 和 Hotmail 的垃圾邮件文件夹中 当我在 Gmail 中检查原始来源时 我看到以下内容 送到了 送去了 电子邮件受保护 cdn
  • 使用 iText 在内存上生成在磁盘上生成的 PDF

    我正在从 Java 应用程序生成 PDF 并且效果很好 问题是 PDF 在磁盘上生成为 Document documento new Document PageSize A4 25 25 25 25 PdfWriter writer Pdf
  • Visual Studio Code 调试控制台中的 pydevd 警告

    我已经搜索了一段时间但找不到任何相关问题 当使用 Visual Studio Code 和 Python 扩展来调试大型元素时 计算表示或获取属性可能需要一些时间 在这些情况下 会出现如下警告 pydevd 警告 计算 DataFrame
  • jQuery的$如何既是函数又是对象?

    我的意思是对象 object Object 它是怎么做的 selector and fn init同时 你能给我一个简单的例子吗 这并不是 jQuery 独有的 而是 javascript 的一个方面 所有函数都是对象 例如 var f f
  • 比较具有相同值但顺序不同的两个数组

    我有 2 个 nsarray 具有相同的值但顺序不同 NSArray array1 0 1 2 3 NSArray array2 2 3 1 0 我需要一种方法来确定两个数组是否具有不同顺序的相同值 Kind of BOOL isSameV
  • 使用 Numpy 获取多项式的系数

    我正在尝试获取 a 的系数numpy polynomial polynomial Polynomial通过获得 这fit method import numpy polynomial as poly x 1 2 3 4 5 y 16 42
  • 使用 jQuery 触发真实事件

    看来 jQuery 的trigger 仅运行与 jQuery 绑定的事件处理程序 我有一些使用本机浏览器事件绑定的模块 使用来自的代码https stackoverflow com a 2676527 https stackoverflow
  • 有没有办法用 gcc 查询直接模块依赖关系?

    给定一个模块 a m cc export module A import B import C import D h 有没有一种调用 gcc 的方法 类似于 M 对标头所做的操作 来列出对其他模块和导入标头 即 B C 和 D h 的直接依
  • C Treenode 指针通过全局变量改变值

    所以 这就是故事 我正在尝试创建一个递归下降解析器 该解析器对字符串进行标记 然后从这些标记中创建一棵节点树 我的主要课程的所有指针都在工作 如果您之前使用过 RDP 那么您知道我在谈论程序 gt 语句 gt allocateStmt 等等