【发布时间】:2015-08-03 09:59:37
【问题描述】:
首先我想说的是,我对“幕后”发生的导致此问题的事情感兴趣,就像我对代码的盲目修复一样。也许 C++ 标准或我不熟悉的东西决定了它的原因:-)
无论如何...
我正在尝试将 3 个数组 A, B, C 传递给一个函数,该函数将合并 A 和 B,并将结果存储在 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 也是如此。但是当我通过数组到函数,我尝试再次计算大小,通过相同的方法,但我得到了两个数组的结果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;
...
问题 2。
只是为了好玩,我尝试遍历 a 和 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 - 到
6添加两个零 -678900 - 到
8添加其他内容 -678900-126926969126613
当然,打印 C 不会产生任何结果。
这些怪事是因为
- 事实上我使用的是C++ Shell(带有选项
-std=c++14 -Wpedantic -O2)? - 向
merge()传递数组不正确? -
main()中的初始化不正确? - 需要有终止符的数组,比如 char 数组?
- 以上所有?
【问题讨论】: