传递给C函数的数组给出了不同的长度

传递给C函数的数组给出了不同的长度,第1张

概述我想首先说 – 我对“幕后”发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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, 我想首先说 – 我对“幕后”发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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.
奇怪的是,在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数组?
>以上所有?

解决方法 >在第一种情况下,您有一个数组,它与指针不同.所以sizeof是正确计算的.而int *是一个指针,而传递给函数的数组总是衰减到一个指针(除非通过引用传递). sizeof(int *)/ sizeof(int)也就是你机器上指针的大小除以int的大小,所以如果你的系统是64位(8字节)并且int的典型大小是4,你得到8/4 = 2.
>通过索引越界来典型的未定义行为.

建议:使用std :: vector< int>相反,你将避免为C分配内存并使用sizeof.您可以简单地使用std :: vector :: size()成员函数来获取向量的大小.

总结

以上是内存溢出为你收集整理的传递给C函数的数组给出了不同的长度全部内容,希望文章能够帮你解决传递给C函数的数组给出了不同的长度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1218291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存