对通过指针访问结构成员感到困惑

2023-12-26

我是 C 新手,对通过指针引用结构成员时得到的结果感到困惑。请参阅以下代码示例。当我第一次引用 tst->number 时发生了什么?我在这里缺少什么基本的东西?

#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int number;
} Test;

Test* Test_New(Test t,int number) {
    t.number = number;
    return &t;
}    

int main(int argc, char** argv) {    
    Test test;
    Test *tst = Test_New(test,10);
    printf("Test.number = %d\n",tst->number);
    printf("Test.number = %d\n",tst->number);
    printf("Test.number = %d\n",tst->number);
}

输出是:

Test.number = 10
Test.number = 4206602
Test.number = 4206602

当您将 test 传递到 Test_New 函数时,您将按值传递它,因此会在堆栈上为 Test_New 函数的函数范围创建本地副本。由于您返回变量的地址,因此一旦函数返回,堆栈就没用了,但您返回了指向旧堆栈上的结构的指针!因此,您可以看到您的第一次调用返回了正确的值,因为没有任何内容覆盖您的堆栈值,但后续调用(全部使用堆栈)会覆盖您的值并给出错误的结果。

要正确执行此操作,请重写 Test_New 函数以获取指针并将指向结构的指针传递到函数中。

Test* Test_New(Test * t,int number) {
    t->number = number;
    return t;
}

int main(int argc, char ** argv)  {
   Test test;
   Test * tst = Test_New(&test,10);

   printf("Test.number = %d\n",tst->number);
   printf("Test.number = %d\n",tst->number);
   printf("Test.number = %d\n",tst->number);

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

对通过指针访问结构成员感到困惑 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调

随机推荐

  • 由于多个抽象基类,实现两个具有相同名称但不同的非协变返回类型的函数

    如果我有两个抽象类定义一个具有相同名称但不同的非协变返回类型的纯虚函数 我如何从它们派生并定义它们的函数的实现 include
  • 在 Django 中提供静态 HTML

    我对 Django 还很陌生 所以请原谅我 如果这是我不应该考虑的事情 但我希望我的应用程序能够链接到大量静态 HTML 页面 足以为每个页面创建 URL 路径 是不合理的 并且会不断有更多的内容被上传 由我通过 FTP 我通过将这些 HT
  • 私有静态最终字段

    我只是想澄清这一点 有什么区别 private static int STUDENT AGE 18 and private static final int STUDENT AGE 18 领域内 乔恩 斯基特 Jon Skeet 解释为 与
  • 具有文件系统依赖性的单元测试代码

    我正在编写一个组件 给定一个 ZIP 文件 该组件需要 解压缩文件 在解压后的文件中找到特定的dll 通过反射加载该 dll 并调用其上的方法 我想对这个组件进行单元测试 我很想编写直接处理文件系统的代码 void DoIt Zip Unz
  • 如何使用 Java 获取 XML id 值?

    对于 XML 关键字搜索项目 用户可以搜索 XML 代码中的任意值
  • 添加新数据源对话框期间新连接失败

    问题 如果我安装了 Visual Studio 2010 Service Pack 1 并且转到 数据 添加新数据源 并单击 数据库 则会显示标准的 选择数据连接 向导页面 在该页面上 如果我配置了现有连接 则可以选择它 并将该数据源添加到
  • iOS VIPER架构,谁必须实例化整个模块?

    考虑到VIPER结构 我有两个模块 A 和 B 第一个模块 A 通过演示器想要执行必须在模块 B 中完成的操作 因此告诉其线框执行该操作 问题是 谁负责实例化整个模块 视图 交互器 演示器 我看到了一些采用不同方法的例子 在应用程序的开头创
  • boto3 lambda 调用运行 ECS 任务需要在修订号中进行硬编码吗?

    长话短说 我不想将任务的 ECS 任务定义修订号硬编码到我的 lambda 源代码中 每次我更新任务定义时 本质上都是更新我的源代码 在ECS 的 boto3 文档run task https boto3 amazonaws com v1
  • 如何重命名 Dask Dataframe 的索引

    我将如何重命名 dask 数据帧上的索引 我尝试过像这样 df index name foo 但重新检查 df index name 显示它仍然是以前的样子 这似乎不是一种有效的方法 所以如果有更直接的方法我不会感到惊讶 d index n
  • 在 AWS 中使用 Python 中的 Lambda 将文件写入 S3

    在 AWS 中 我尝试使用 Lambda 函数将文件保存到 Python 中的 S3 虽然这可以在我的本地计算机上运行 但我无法让它在 Lambda 中运行 我一整天都在研究这个问题 非常感谢您的帮助 谢谢 def pdfToTable P
  • 如何在 PHP 中重新索引数组但索引从 1 开始?

    我有以下数组 我想对其重新索引 以便反转键 最好从 1 开始 当前数组 edit 该数组实际上看起来像这样 Array 2 gt Object title gt Section linked gt 1 1 gt Object title g
  • Airflow - Python 文件不在同一个 DAG 文件夹中

    我正在尝试使用 Airflow 来执行一个简单的 python 任务 from future import print function from airflow operators python operator import Pytho
  • 如何解决 C# 应用程序中的 FTP 超时问题

    我正在使用以下 C 代码从远程服务提供商通过 FTP 传输约 40MB 的 CSV 文件 大约 50 的情况下 下载会挂起并最终超时 在我的应用程序日志中 我得到如下一行 gt Unable to read data from the tr
  • 更改 editText 提示的字体

    是否可以更改显示在提示中的字体EditText场地 我想在 xml 本身中设置字体 您可以使用 SpannableString 和自定义 TypefaceSpan 来更改它 首先 创建一个 Custom TypefaceSpan 类 pub
  • 避免图像 CSS 拉伸

    我正在将图像渲染成div 我想避免我的形象被拉伸 div height 300px width 300px img min width 300px min height 300px max height 300px 我的问题是我的图像的宽度
  • 适用于 Node.js 脚本的 hashbang

    我正在尝试为 node js 创建一个可以在多种环境中运行的脚本 特别是对我来说 我经常在 OS X 和 Ubuntu 之间来回切换 在前者中 Node 安装为node 但在后者中是nodejs 在我的脚本的顶部 我可以有 usr bin
  • 茉莉花业力中的模块“DynamicTestModule”导入了意外值“未定义”

    我正在使用 jasmine karma 进行单元测试 配置 types jasmine 2 8 6 types jasminewd2 2 0 3 types jquery 3 3 22 types node 8 9 4 codelyzer
  • JS Promises - 当只有单个路径是异步时的 if-else 流程

    我正在重写一些遗留代码 这些代码是使用同步ajax构建的 太糟糕了 现在我正在使用 Promises 特别是 Bluebird 在很多情况下 函数有很多路径 其中只有一个是异步的 问题是我必须识别所有路径并手动从每个路径返回新的承诺 像这样
  • 如何在 C++ (Win32) 中有效地终止进程?

    我目前正在编写一个非常轻量级的程序 因此我必须使用 C 因为它没有绑定到 NET 框架 这大大增加了程序的大小 我需要能够终止进程 为此我需要获取进程句柄 不幸的是我还没想好如何做到这一点 附 我知道要杀死一个进程 你必须使用终止进程 与其
  • 对通过指针访问结构成员感到困惑

    我是 C 新手 对通过指针引用结构成员时得到的结果感到困惑 请参阅以下代码示例 当我第一次引用 tst gt number 时发生了什么 我在这里缺少什么基本的东西 include