C/C++ 数组作为参数传递到函数后,使用 sizeof 产生的问题

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 数组作为参数传递到函数后,使用 sizeof 产生的问题相关的知识,希望对你有一定的参考价值。

有时候需要使用 sizeof(g)/sizeof(g[0]) 计算数组的长度(假设有数组 g)。这里先解释下为什么这样计算:

sizeof(g) : 整个数组占用的字节数;

sizeof(g[0]) : g[0] 占用的字节数;

所以 sizeof(g)/sizeof(g[0]) 为数组长度,但是有时候这样计算会出错,例如下面这种情况:

#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

void func(char s[], int n){
    cout<<"----------------- func -------------------"<<endl;
    cout<<"sizeof(s) = "<<sizeof(s)<<endl;
    cout<<"sizeof(s[0]) = "<<sizeof(s[0])<<endl;
    cout<<"The length of s is "<<sizeof(s)/sizeof(s[0])<<endl;
    cout<<"----------------- pointer -------------------"<<endl;
    char *p = NULL;
    cout<<"sizeof(p) = "<<sizeof(p)<<endl;
}

int main()
{
    cout<<"----------------- main -------------------"<<endl;
    char g[] = {'a', 'b', 'c', 'd', 'e'};
    cout<<"sizeof(g) = "<<sizeof(g)<<endl;
    cout<<"sizeof(g[0]) = "<<sizeof(g[0])<<endl;
    cout<<"The length of g is "<<sizeof(g)/sizeof(g[0])<<endl;
    func(g, 3);
    return 0;
}

输出结果:

----------------- main -------------------
sizeof(g) = 5
sizeof(g[0]) = 1
The length of g is 5
----------------- func -------------------
sizeof(s) = 4
sizeof(s[0]) = 1
The length of s is 4
----------------- pointer -------------------
sizeof(p) = 4

在上面的输出中,第一部分 main 输出的信息符合预期。但是,将数组 g 作为参数传递到函数 func 时,再做同样的计算,结果就不一样了,为什么呢?

因为数组作为函数参数传递后,会退化为指针,所以计算 sizeof(s) = 4 ,实质等价于计算 sizeof(char *s) 的大小,指针变量大小为 4 字节(在 32 位平台上)。sizeof(s[0]) 计算的是第一个字符的字节大小,即为 1。我们可以看到指针变量 p 计算大小后也为 4。

所以在将数组作为参数传递到函数时,注意 sizeof() 的使用,最好的方式是一同传递一个数组元素个数的变量,比如上面例子中的 n。

参考文献:

[1] https://wenku.baidu.com/view/678d1925a5e9856a561260b1.html

[2] https://blog.csdn.net/ljob2006/article/details/4872167

以上是关于C/C++ 数组作为参数传递到函数后,使用 sizeof 产生的问题的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中的指针

在 C/C++ 中将数组作为形式参数传递为 int arr[] 和 int arr[N] 之间的区别

将参数从 C/C++ JNI 传递到 Java 并获取修改后的值

C / C ++:将带有成员数组的结构/类按值传递给函数

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

c# 请问数组能作为参数传递吗? 如果可以如何传递呢?