在递增指针后使用strlen()会发生什么?

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

Ste*_*mit 7

首先,对于题外话感到抱歉,但请不要使用过时的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)

本来应该的.

  • @axiac"终止`\ 0`是一个实现细节"你正在解决的问题是他没有在算法课中学到这个事实,但当然如果我们把注意力集中在C上,那么null终止不只是一个"实施细节"; 它是语言的一部分. (2认同)