fro*_*pad -3 c arrays pointers gets strlen
我做了一些研究strlen()并提出了一个问题.
假设我有一个50元素数组和一个指向第一个元素的指针,意思是:
char A[50],*x;
gets(A);
x=&A[0];
Run Code Online (Sandbox Code Playgroud)
从我的理解,strlen(x)我应该给我字符串的长度.
我的问题是,当我增加时会发生什么x?
首先,对于题外话感到抱歉,但请不要使用过时的gets()功能.请fgets改用.
在回答你的问题时,如果x是指向有效非空字符串的指针,strlen(x+1)则总是相等strlen(x) - 1.
假设我们有这个字符串,x指向它:
+---+---+---+---+---+---+
a: | H | e | l | l | o | \0|
+---+---+---+---+---+---+
^
|
+---|---+
x: | * |
+-------+
Run Code Online (Sandbox Code Playgroud)
也就是说,x指向字符串的第一个字符.现在,strlen简单地从指向字符开始并计算字符,直到它找到终止'\0'.
所以如果我们增加x,现在它指向'e'(也就是说,它指向字符串"ello"),如下所示:
+---+---+---+---+---+---+
a: | H | e | l | l | o | \0|
+---+---+---+---+---+---+
^
|
/
/
/
|
+---|---+
x: | * |
+-------+
Run Code Online (Sandbox Code Playgroud)
所以strlen会得到一个更少的长度.
脚注:我想起了我不止一次遇到的一个有趣的错误.当您使用malloc为字符串分配空间时,您始终必须记住包含用于终止的空间'\0'.只是不要这样做:
char *p = malloc(strlen(str + 1));
Run Code Online (Sandbox Code Playgroud)
我的同事曾经这样做了一次(不,真的,这是一个同事,而不是我!),并且很难追查到,因为很容易看到有缺陷的代码并且没有看到它不是' Ť
char *p = malloc(strlen(str) + 1);
Run Code Online (Sandbox Code Playgroud)
本来应该的.