我想说首先 - 我对导致这个问题的“幕后”发生的事情感兴趣,就像我对代码的盲目修复一样感兴趣。也许 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 数组?
- 上述所有的?