传递给 C++ 函数的数组给出不同的长度

2023-12-14

我想说首先 - 我对导致这个问题的“幕后”发生的事情感兴趣,就像我对代码的盲目修复一样感兴趣。也许 C++ 标准或我不熟悉的东西决定了导致它的原因:-)

无论如何...

我试图传递 3 个数组,A, B, C到一个函数中,它将合并A and B,将结果存储在C.

函数声明:void merge(int* a, int* b, int* c)

通过自main() by:

int A[] = {1,2,3,4};
int B[] = {6,7,8,9};
int* C;  //this could be wrong, btw!

merge(A, B, C);

Issue 1.奇怪的是在main(),如果我打印结果sizeof(A)/sizeof(A[0]),它给了我数组“长度”的正确结果 -4- B 也是如此。但是当我将数组传递给函数时,我尝试再次计算大小,用同样的方法,但我得到了结果2对于两个数组。第一行merge():

void merge(int* a, int* b, int* c)
{
    int sizeA = sizeof(a)/sizeof(a[0]);
    int sizeB = sizeof(b)/sizeof(b[0]);
    int totalsize = sizeA + sizeB;

    std::cout << "size A = " << sizeA << std::endl;      //prints 2
    std::cout << "size B = " << sizeB << std::endl;      //prints 2
    std::cout << "total  = " << totalsize << std::endl;
...

Issue 2.只是为了好玩,我尝试迭代a and b传递给merge()(在合并功能内):

for (int i = 0; i < 4; ++i)
    std::cout << a[i]; //prints "1234" as expected

一切都很酷。但是当我将索引限制增加到 8 时...

for (int i = 0; i < 8; ++i)
    std::cout << a[i]; //prints "12346789" - A and B concatenated!

再次提高最大索引几次,因为为什么不呢:

for (int i = 0; i < 10; ++i)
    std::cout << a[i]; //prints "1234678900"
...
for (int i = 0; i < 11; ++i)
    std::cout << a[i]; //prints "1234678900-444896443"

我猜是越界索引和访问其他内存导致的未定义行为。

印刷b以同样的方式做类似的事情:

  • 循环到i = 4打印数组 -6789
  • to 6添加两个零 -678900
  • to 8添加其他东西 -678900-126926969126613

当然,打印 C 不会产生任何结果。


这些奇怪的现象是由于

  • 事实上我正在使用C++ 外壳(带有选项-std=c++14 -Wpedantic -O2) ?
  • 数组的错误传递merge() ?
  • 错误的初始化main() ?
  • 需要有终止符的数组,例如 char 数组?
  • 上述所有的?

  1. 在第一种情况下,你有一个数组,这与指针不同。所以sizeof计算正确。然而int*是一个指针,传递给函数的数组总是衰减为指针(通过引用传递时除外)。还sizeof(int*)/sizeof(int)是机器上指针的大小除以int,因此如果您的系统是 64 位(8 字节)并且int典型尺寸为4, 你得到8/4=2.
  2. 索引越界导致的典型未定义行为。

建议:使用std::vector<int>相反,您将避免为其分配内存C并使用sizeof。您可以简单地使用std::vector::size()成员函数获取向量的大小。

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

传递给 C++ 函数的数组给出不同的长度 的相关文章

随机推荐

  • Rails 3 路由约束和正则表达式

    我正在寻找匹配的模式state city在路径中 除非状态变量等于 auth match state city gt cities index as gt state cities constraints gt state gt auth
  • GCC 的 -Wmaybe-uninitialized 是否会针对基于枚举的 switch 语句使用 -O1 生成虚假警告?

    我有一段以下形式的代码 typedef enum A 1 B EnumType int foo EnumType x int r switch x case A r 1 break case B r 2 break default r 1
  • JDBC总是测试MySQL表的最后一行?

    我有一个 Manager 类 它将数据保存在 SQL 表中 并从 SQL 表中获取结果并测试这些数据 当我运行程序时 将显示一个框架 用于获取 ID 和密码 如果它们正确 则另一个框架将显示但我不知道为什么它只测试 SQL 表的最后一行 我
  • 当我删除标记所在的行时让vim保留标记

    当我删除标记所在的行时 如何让 vim 保留标记 即自动将标记移动到标记行的上方或下方的行 也许最简单的方法是当您不想删除它们时使用大写字母标记 如果标记所在的行被删除 它将移至下一行 另一种选择是lockmarks命令 lockmarks
  • python中同一类的实例之间共享变量

    我有一个我需要的课程 第一个实例必须接收一个参数 以下所有实例的此参数都是可选的 如果没有通过那么我将使用之前对象init的参数 为此 我需要在对象之间共享一个变量 所有对象都属于具有相同父级的类 例如 class MyClass shar
  • 如何在 open gl 纹理的 alpha 中编码发射或镜面反射信息

    我有一个带有 UV 贴图的 OpenGL 纹理 我读过有关使用 alpha 通道来存储其他一些值的信息 这样就无需从某处加载额外的地图 例如 您可以在 Alpha 中存储镜面反射信息 光泽度 或发射贴图 因为您只需要一个浮点数 并且不使用
  • PHP函数的范围[重复]

    这个问题在这里已经有答案了 我有一个文件 将我的可重用函数集中到一个文件中 functions php It s include once 在每个需要它的页面上 当我的自定义函数尝试访问其自身范围之外的 MySQL 连接时 我收到错误 来源
  • 带有函数应用的类型化抽象语法树

    我正在尝试编写一个可以表示的类型化抽象语法树数据类型 功能应用 到目前为止我已经 type Expr lt a gt Constant of a Application of Expr lt b gt a gt Expr lt b gt e
  • Appcompat actionbar v21 应用程序图标未显示

    出于材料设计目的 我升级到了 avtionbar app compat v21 但我观察到 与旧的应用程序兼容库相比 它在操作栏中不显示应用程序图标 导航菜单和后退按钮占用了更多空间 有人遇到过这个问题吗 我搜索了很多 但没有发现任何有用的
  • 无法使用 FastAPI 访问或打印任何请求数据

    我有一个简单的 FastAPI 端点 我想在其中接收字符串值 在本例中 我尝试使用 JSON 正文 但基本上不需要是 JSON 我真的只需要一个简单的字符串来将请求彼此分开 不幸的是 我无法使用以下命令访问任何请求参数GET方法 我也尝试过
  • 如何将 Excel 电子表格配置为 javax.sql.DataSource?

    我有一个 Spring Boot 1 3 0 Java 8 应用程序 需要使用 Excel 作为数据源 由于 Excel 文件类型的原因 POI 和 JXL 不起作用 应用程序需要在 unix 环境中运行 我将应用程序配置为通过 yml 文
  • 在 web.config 中保留敏感信息

    将用户名或密码存储在中是否安全web config作为其他参数 例如超时时间在ASP NET MVC应用程序 如果不是 是否可以使这些参数变得安全 以便它们不能被编码在web config文件在发布的服务器上 另一方面 您是否建议将用户名
  • 将 ImageView 保存到 Android 模拟器库

    我想将图像保存到 Android Gallery 这是我当前的代码 image setDrawingCacheEnabled true image buildDrawingCache true Bitmap b image getDrawi
  • 必须声明标量变量

    首先 我创建了一个包含一列的内存表 并使用这些列值与另一个表进行内部联接 这样做时我收到此错误 必须声明标量变量 暂时的 谁能解释一下我哪里出了问题 DECLARE ID INT Declare Temporary Table Accoun
  • fortran 代码中 Rectilinear_grid 的二进制 vtk 无法通过 paraview [重复]

    这个问题在这里已经有答案了 我使用了 stackoverflow 发布的代码并将其修改为 program VTKBinary implicit none real 4 x 2 0 1 real 4 y 2 0 1 real 4 z 2 0
  • 如何在R中通过ID计算日期之间的平均差异

    我有如下数据集 我想计算每个唯一 id 的平均时间差 data membership id created date 1 12000000 2015 01 20 2 12000001 2012 11 19 3 12000001 2013 1
  • Redisearch合计返回每组前5名

    假设我有以下格式的文档 product name TEXT tags TAG score NUMERIC product1 tag1 tag2 tag3 10 product2 tag2 tag3 tag4 100 我想要一个查询按照产品得
  • 错误会话:创建池到 /127.0.0.1:9042 时出错

    当我遇到此错误时 我尝试在 cassandra 中插入值 15 08 14 10 21 54 INFO Cluster New Cassandra host a b c d 9042 added 15 08 14 10 21 54 INFO
  • 在 Git 中获取从 master 到分支的更改

    在我的存储库中 我有一个名为aq我正在努力 然后我提交了新的工作和错误master 将这些提交纳入其中的最佳方法是什么aq分支 创建另一个新分支master并将其与aq 查看aq分支 并从master git checkout aq git
  • 传递给 C++ 函数的数组给出不同的长度

    我想说首先 我对导致这个问题的 幕后 发生的事情感兴趣 就像我对代码的盲目修复一样感兴趣 也许 C 标准或我不熟悉的东西决定了导致它的原因 无论如何 我试图传递 3 个数组 A B C到一个函数中 它将合并A and B 将结果存储在C 函