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
相关产品推荐
相关产品推荐

