加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:11:42 所属栏目:百科 来源:网络整理
导读:我想首先说 – 我对“幕后”发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许C标准或我不熟悉的东西决定了它的原因:-) 无论如何… 我试图将3个数组A,B,C传递给一个函数,它将合并A和B,将结果存储在C中. 函数声明:void merge(int * a,int * b,int *
我想首先说 – 我对“幕后”发生的事情感兴趣导致这个问题,因为我正在盲目修复代码.也许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()成员函数来获取向量的大小.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读