无论如何…
我试图将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.
奇怪的是,在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数组?
>以上所有?
>通过索引越界来典型的未定义行为.
建议:使用std :: vector< int>相反,你将避免为C分配内存并使用sizeof.您可以简单地使用std :: vector :: size()成员函数来获取向量的大小.
总结以上是内存溢出为你收集整理的传递给C函数的数组给出了不同的长度全部内容,希望文章能够帮你解决传递给C函数的数组给出了不同的长度所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)