传递给C函数的数组给出了不同的长度
我想首先说 – 我对“幕后”发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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,C); 问题1. 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. 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 当然,打印C不会产生任何结果. 这些奇怪的事情是否是结果 >我使用的是C++ Shell(选项-std = c 14 -Wpedantic -O2)? 解决方法
>在第一种情况下,您有一个数组,它与指针不同.所以sizeof是正确计算的.而int *是一个指针,而传递给函数的数组总是衰减到一个指针(除非通过引用传递). sizeof(int *)/ sizeof(int)也就是你机器上指针的大小除以int的大小,所以如果你的系统是64位(8字节)并且int的典型大小是4,你得到8/4 = 2.
>通过索引越界来典型的未定义行为. 建议:使用std :: vector< int>相反,你将避免为C分配内存并使用sizeof.您可以简单地使用std :: vector :: size()成员函数来获取向量的大小. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |