从 C 函数返回数组

2024-03-08

我编写了一个返回数组的函数,虽然我知道我应该返回一个动态分配的指针,但我仍然想知道当我返回在函数内部本地声明的数组(不将其声明为静态)时会发生什么,当我注意到函数中内部数组的内存没有被释放时,我感到很惊讶,并且我将数组返回到主函数。 主要的:

int main()
{
    int* arr_p;
    arr_p = demo(10);

    return 0;
}

和功能:


int* demo(int i)
{
    int arr[10] = { 0 };
    for (int i = 0; i < 10; i++)
    {
        arr[i] = i;
    }
    return arr;
}

当我取消引用时arr_p我可以看到设置的0-9整数demo功能。 两个问题:

  1. 怎么我检查的时候arr_p我看到它的地址与arr这是在demo功能?
  2. 怎么会demo_p指向已经在中的未释放的数据(0-9数字)demo?我期望arr inside demo当我们退出时将被释放demo scope.

编程时必须注意的事情之一是要充分注意规则的内容,而不仅仅是那些看起来有效的内容。规则规定您不应该返回指向本地分配数组的指针,这是一条真实的规则。

如果您在编写返回指向本地分配数组的指针的程序时没有收到错误,这并不意味着它没问题。 (尽管如此,这意味着您确实应该获得一个更新的编译器,因为任何像样的现代编译器will警告这一点。)

如果您编写一个返回指向本地分配数组的指针的程序并且它似乎可以工作,那么这也不意味着它没问题。对此要非常小心:一般来说,在编程中,尤其是在 C 中,似乎有效的是not证明你的程序没问题。你真正想要的是你的程序能够运行出于正确的理由.

假设你租了一套公寓。假设,当您的租约到期并且您搬出时,您的房东没有向您收取钥匙,但也没有换锁。假设几天后,您意识到自己把某样东西忘在了壁橱后面。假设你没有询问就偷偷溜回来尝试收集它。接下来发生什么?

  • 碰巧的是,你的钥匙在锁里仍然可以使用。这是一个完全的惊喜,还是有点出乎意料,或者保证有效?
  • 碰巧的是,你忘记的物品仍然存在is在衣柜里。目前尚未清除。这是一个完全的意外,还是有点出乎意料,或者肯定会发生?
  • 最后,无论是你的旧房东还是警察,都没有因为你的非法侵入行为而向你招呼。再说一次,这完全是一个惊喜,还是有点出乎意料,还是完全在意料之中?

您需要知道的是,在 C 语言中,重用您不再被允许使用的内存与偷偷溜回您不再租用的公寓几乎完全相同。它可能有效,也可能无效。你的东西可能还在,也可能不在。你可能会遇到麻烦,也可能不会。无法预测将会发生什么,并且无论发生或未发生,都无法得出(有效)结论。

返回到您的程序:局部变量,例如arr通常存储在调用堆栈上,这意味着即使在函数返回后它们仍然存在,并且可能不会被覆盖,直到调用下一个函数并将堆栈上的该区域用于其自己的目的(甚至可能不会被覆盖) )。因此,如果您返回一个指向本地分配内存的指针,并立即取消引用该指针(在调用任何其他函数之前),那么它至少有可能“工作”。这又类似于公寓的情况:如果还没有其他人搬进来,那么您忘记的物品很可能仍然在那里。但这显然不是你可以依赖的东西。

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

从 C 函数返回数组 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐

  • 模板依赖 false

    我有一个不能直接使用的类模板 只允许专业化 我想用static assert显示有意义的错误消息 我不能只打字static assert false error since false不依赖于值 即使从未使用过模板 编译器也可能会显示错误消
  • 如何增加 Android 2.3 (Gingerbread) 上的堆大小?

    当我尝试创建一个时出现 OutOfMemoryErrorString大于 4MB 使用StringBuilder append 据我所知 StringBuilder没有任何关于大小的限制 所以没有String 所以我搜索了 如何增加 And
  • 当条件为真时,Pandas 将数据帧拆分为多个

    我有一个数据框 如下面的 df 我想为条件为真的每个数据块创建一个新的数据帧 以便它将返回 df 1 df 2 df n df df 1 df 2 Value Condition Value Value 2 True 2 0 5 True
  • HttpServerUtility.UrlPathEncode 与 HttpServerUtility.UrlEncode

    有什么区别HttpServerUtility UrlPathEncode and HttpServerUtility UrlEncode 我什么时候应该选择其中之一 网址编码对于查询字符串值很有用 因此在每个 的左侧 尤其是右侧 在这个网址
  • Eclipse java 调试:找不到源

    在 Eclipse 中调试 Java 应用程序时 我收到一个 未找到来源 两种情况下的错误 进入已导入的不同项目中的文件 进入已安装的 Maven 存储库中的文件 文件在那里 但 Eclipse 不会进入其中 而是显示一个按钮 附上来源 我
  • Eclipse / Scala 插件中的“非法循环引用”错误

    我已经创建了一个文件夹x带有源文件package scala在里面 该文件包含以下代码 package x package object y trait A case class B extends A Eclipse 显示编译错误 ill
  • 切换到Android Studio 2.0后使用Dagger 2时出现NoClassDefFoundError

    在升级到 Android Studio 2 0 之前 我可以毫无问题地使用 Dagger 2 现在我得到了NoClassDefFoundError这让我停顿了一天多 我正在寻求帮助 看来 Gradle 不能我的AppModule类 尽管很明
  • 静态成员实例引用问题[重复]

    这个问题在这里已经有答案了 我在 Analytics 类中保存了以下静态方法 public static void buttonHit string eventName string eventAction string descripti
  • 使用 jquery 的 .validate 函数提交表单

    这是一个简单的问题 我有一个正在使用 jquery 的 validate 函数进行验证的表单 问题是 只有当我使用以下方式提交表单时 验证似乎才起作用
  • 如何在启动后将调试器附加到 iOS 应用程序?

    我正在解决一个问题 该问题很少发生 并且当我在 Xcode 下运行东西时似乎不会发生 是否可以正常运行应用程序 即从 Springboard 直到出现我的问题 然后在此时附加调试器 如果可能的话 我更愿意在不越狱的情况下执行此操作 连接已连
  • 为加密数据创建订单列

    我正在将加密数据保存到数据库中 有没有一种方法可以创建纯文本数据的 哈希码 或指纹或校验和 如果我对 哈希码 进行排序 排序 则顺序将与我保存纯文本数据并执行相同同样的sort order by操作可以吗 我基本上需要一个 SOUNDEX
  • Rails:我应该如何在控制器之间共享逻辑?

    这个问题肯定有人问过 但我找不到 我有一个UsersController and an Admin UsersController 显然 这些类中发生了很多事情 例如 strong parameters 创建 编辑用户后要遵循的路径 是相同
  • Rails rspec 设置子域

    我正在使用 rSpec 来测试我的应用程序 在我的应用程序控制器中 我有一个像这样的方法 def set current account current account Account find by subdomain request s
  • adwords api:检索每日支出(费用)

    有人有一些示例代码来说明如何获取 AdWords 帐户的每日总支出 所有广告系列 吗 我无法找到以简单的方式执行此类操作的示例代码 因此任何帮助 指针 代码将不胜感激 我将使用 python 库 但任何其他语言也很酷 提前致谢 Hoff 我
  • 无法在 Xcode 中找到设备支持文件[重复]

    这个问题在这里已经有答案了 在我的设备中运行我的应用程序时 我在 Xcode 中遇到以下错误 Xcode 版本为 10 01 我的设备 iOS 版本为 12 2 iPhone 5S 无法找到设备支持文件 您需要将 Xcode 更新到最新版本
  • 模块“rxjs”没有导出成员“firstValueFrom”

    App service 文件如下所示 import Injectable from nestjs common import HttpService from nestjs axios import Observable firstValu
  • 使用失败、回溯 Prolog 查找列表的最小值

    我想使用导致回溯的失败来计算列表的最小值 我如何改变分钟 分钟 X 分钟 以使其工作 min X A B X is the min of A B min X X Y X lt Y min Y X Y Y lt X member X X me
  • 使用隐藏代码在 WPF 中缩放画布

    这里的场景是 我有一张画布 上面画着不同的图表 现在的要求是使用 C 或 VB 使用背后的代码放大画布 此外 我需要将缩放代码放置在某个 dll 中 以便我可以在我的应用程序中重复使用同一组代码 现在我的问题是如何做到这一点 我已经尝试过以
  • 如何在 bootstrap4 中添加自定义断点以及如何在 scss 中使用响应式断点混合

    我正在开发一个 Angular 5 应用程序 它需要是一个响应式应用程序 我面临着使其响应的问题1366X768 and 1920X1080字体大小不同的分辨率 问题一 我在 style scss 中覆盖了断点 如下所示 grid brea
  • 从 C 函数返回数组

    我编写了一个返回数组的函数 虽然我知道我应该返回一个动态分配的指针 但我仍然想知道当我返回在函数内部本地声明的数组 不将其声明为静态 时会发生什么 当我注意到函数中内部数组的内存没有被释放时 我感到很惊讶 并且我将数组返回到主函数 主要的