我想首先说 - 我对"幕后"发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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);
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.
为了好玩,我尝试迭代a并b传递给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打印数组 -67896添加两个零-6789008添加其他的东西-678900-126926969126613当然,打印C不会产生任何结果.
这些奇怪的事情是否是结果
-std=c++14 -Wpedantic -O2)?merge()?main()?sizeof正确计算了.而int*是一个指针,并传递给函数的阵列总是衰减到指针(通过引用传递时除外).也是sizeof(int*)/sizeof(int)你机器上指针的大小除以它的大小int,所以如果你的系统是64位(8字节)并且int具有典型大小4,你得到8/4=2.建议:std::vector<int>改为使用,你将避免为内存C和使用分配内存sizeof.您可以简单地使用std::vector::size()成员函数来获取向量的大小.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |