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

C语言新手求助:如何通过指针获取字符数组的实际长度?

如何通过指针获取C语言中字符数组的实际大小

嘿,我来帮你理清这个问题~首先得先揪出你写的getSize函数里的关键错误,然后再给你讲清楚背后的逻辑和正确做法。

首先,你的循环逻辑写错了!你在循环里移动的是临时指针t,但判断终止条件的时候用的却是s != '\0'——s从始至终都指向字符串的首地址,永远不会等于'\0',这就导致循环无限跑下去停不下来。而且还有个小问题:你判断的是指针本身是否等于'\0',但正确的应该是判断指针指向的内容是否为终止符。

修正后的字符串长度函数

把这两个问题改掉,函数就能正常工作了,下面是修正后的代码:

#include <stdio.h>

int getSize(char *s) {
    char *t = s; // 复制指针,避免修改原指针的位置
    int size = 0;
    // 核心:判断指针t指向的字符是否为终止符'\0'
    while (*t != '\0') {
        size++;
        t++;
    }
    return size;
}

int main() {
    char *text = "John Does Nothing";
    char text2[] = "John Does Nothing";
    
    printf("text的实际字符串长度:%d\n", getSize(text));
    printf("text2的sizeof总大小(含终止符):%d\n", sizeof(text2));
    printf("text2的字符串长度(不含终止符):%d\n", getSize(text2));
    
    return 0;
}

必须搞懂的核心区别:sizeof vs 字符串长度

这里得给你区分清楚两个容易混淆的概念:

  • sizeof(text):得到的是指针本身的大小(64位机器上是8字节),因为text是char*类型的指针,编译器只知道它指向一个char,不知道背后数组的长度。
  • sizeof(text2):得到的是整个数组的总字节数(包括末尾的'\0',所以是18),因为text2是数组类型,编译时就能确定它的大小。
  • 我们写的getSize函数(和标准库的strlen函数原理完全一致):得到的是字符串的实际有效长度(不包括末尾的'\0',所以是17)。

重要注意事项

这种通过找'\0'来获取长度的方法,只适用于以'\0'结尾的字符串:

  • 如果你的指针指向的是一个没有终止符的字符数组(比如char arr[] = {'a','b','c'}),这种方法会直接越界访问内存,导致未定义行为。
  • 这种情况下,你必须手动传递数组的大小,或者用其他方式记录长度——C语言本身没办法通过指针直接获取任意数组的大小,因为指针丢失了数组的类型信息(只知道指向的元素类型,不知道数组长度)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:26