gpt4 book ai didi

c++ - 在 C++ 中传递给函数的数组给出不同的长度

转载 作者:太空狗 更新时间:2023-10-29 19:48:10 27 4
gpt4 key购买 nike

我想先说 - 我对“幕后”发生的事情很感兴趣,因为我正在盲目修复代码。也许 C++ 标准或我不熟悉的东西决定了导致它的原因:-)

无论如何...

我试图将 3 个数组 A、B、C 传递给一个函数,该函数将合并 AB,存储结果为 C

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

main() 传递给:

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

merge(A, B, C);

问题 1.奇怪的是,在 main() 中,如果我打印 sizeof(A)/sizeof(A[0]) 的结果,它会为我提供正确的结果数组的“长度”- 4 - 和 B 一样。但是当我将数组传递给函数时,我尝试再次计算大小,通过相同的方法,但我得到了两个数组的结果 2merge()的第一行:

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;
...

问题 2.只是为了好玩,我尝试遍历传递给 merge()ab(在合并函数中):

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
  • 6 添加两个零 - 678900
  • 8 添加其他内容 - 678900-126926969126613

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


这些奇怪的现象是由于

  • 我正在使用 C++ Shell 的事实(带有选项 -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()获取 vector 大小的成员函数。

关于c++ - 在 C++ 中传递给函数的数组给出不同的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31784500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com