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

gal*_*ois 3 c++ arrays

我想首先说 - 我对"幕后"发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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);
Run Code Online (Sandbox Code Playgroud)

问题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;
...
Run Code Online (Sandbox Code Playgroud)

问题2. 为了好玩,我尝试迭代ab传递给merge()(在合并函数内):

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

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

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

将最大索引提高几倍,因为为什么不:

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"
Run Code Online (Sandbox Code Playgroud)

我想,来自越界索引和访问其他内存的未定义行为.

b以相同的方式打印类似:

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

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


这些奇怪的事情是否是结果

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

vso*_*tco 8

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

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