You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数传参时数组需传数组名与长度,字符串无需传长度,原因何在?

数组与字符串参数传递的差异原因

核心原因很简单:C语言中字符串自带结束标志\0,而普通数组没有,具体细节如下:

  • 数组传参的本质:当你把数组名作为参数传给函数时,它会自动退化成指向数组首元素的指针。此时函数拿到的只是一个内存地址,无法通过这个指针直接获取数组的总长度——因为内存里的数组元素是连续存放的,但没有任何标记告诉函数“这是最后一个元素”。所以必须额外传入长度参数,才能让函数正确遍历数组,避免越界访问。
    比如这个函数:

    void print_int_array(int arr[], int length) {
        for (int i = 0; i < length; i++) {
            printf("%d ", arr[i]);
        }
    }
    

    这里的arr[]实际上等价于int *arr,如果不传length,函数根本不知道该循环多少次。

  • 字符串的特殊存储规则:字符串在C里被定义为以\0(ASCII值为0的空字符)结尾的字符数组。所有标准字符串处理函数(比如计算长度的strlen、输出的printf("%s"))都是通过遍历字符,直到找到\0为止来确定字符串的边界。所以传递字符串时,只要传入指向首字符的指针(也就是字符串名),函数就能自己找到结束位置,不需要额外传递长度。
    比如:

    void print_string(char str[]) {
        // 函数内部会自动遍历到'\0'停止
        printf("%s", str);
    }
    

    哪怕你传入的是很长的字符串,只要末尾有\0,函数就能正确处理。

另外要注意:如果是没有\0结尾的字符数组,那它就不是标准意义上的字符串,此时也需要传入长度才能正确处理,否则函数会一直遍历内存直到遇到某个\0,导致不可预期的结果。

内容的提问来源于stack exchange,提问作者xiaohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:42:39