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

如何在函数中获取字符串长度?含指针操作缓冲区长度的问题

C语言函数中获取字符串/缓冲区长度的问题解答

1. 函数中获取字符串长度的方法

要获取字符串长度,直接用标准库函数strlen()即可,但需要注意以下几点:

  • 必须包含头文件<string.h>,否则strlen会因未声明导致编译错误。
  • strlen的计算逻辑是从起始地址开始,直到遇到'\0'终止符为止,所以字符串必须以'\0'结尾,否则会出现越界读取的未定义行为。
  • 调用printf输出长度时,要使用对应size_t类型的格式符%zu,不能直接传strlen的返回值给printf。

针对你给出的代码,存在几个明显错误:

  • 缺少<string.h>头文件;
  • printf没有使用格式符,参数类型不匹配;
  • main中调用fun(&buffer)时,传递的是数组的地址(类型为char (*)[6]),但fun的参数是char*,类型不兼容。

修正后的代码示例:

#include <stdio.h>
#include <string.h>

void fun(char *buffer)
{
    printf("字符串长度:%zu\n", strlen(buffer));
}

int main()
{
    char buffer[] = "Hello";
    fun(buffer);  // 数组名会自动退化为指向首元素的指针,直接传递即可

    return 0;
}

2. 函数中用指针获取缓冲区(数组)长度的方法

这里要明确一个关键知识点:当数组作为参数传递给函数时,会自动退化为指向首元素的指针,此时函数内部无法通过这个指针直接获取原数组的长度——因为指针只存储内存地址,不携带数组的大小信息。

常用的解决方法有两种:

方法1:将数组长度作为额外参数传入

这是最通用、符合标准的做法,在调用函数前先计算数组长度,再一起传递给函数:

#include <stdio.h>

void fun(char *buffer, size_t buf_len)
{
    printf("缓冲区总长度(含终止符):%zu\n", buf_len);
}

int main()
{
    char buffer[] = "Hello";
    // 计算数组总长度:总字节数除以单个元素的字节数
    size_t len = sizeof(buffer) / sizeof(buffer[0]);
    fun(buffer, len);

    return 0;
}

方法2:使用变长数组(VLA,C99及以后标准支持)

可以在函数参数中指定数组的大小,此时函数内部可以通过sizeof获取数组长度:

#include <stdio.h>

// 注意参数顺序:先传长度,再传变长数组
void fun(size_t buf_len, char buffer[buf_len])
{
    printf("缓冲区总长度:%zu\n", buf_len);
    printf("通过sizeof获取的长度:%zu\n", sizeof(buffer) / sizeof(buffer[0]));
}

int main()
{
    char buffer[] = "Hello";
    fun(sizeof(buffer)/sizeof(buffer[0]), buffer);

    return 0;
}

如果是动态分配的缓冲区(比如用malloc/calloc分配的内存),标准C没有提供直接获取分配内存大小的函数,部分编译器(如GCC)提供非标准的malloc_usable_size(),但不具备可移植性。建议在分配内存时就记录下长度,将长度和指针一起传递给函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:45:41