c - 当我在增加指针后使用 strlen() 时会发生什么?

标签 c arrays pointers strlen gets

我对 strlen() 做了一些研究并有一个问题。

假设我有一个数组 50元素和指向第一个元素的指针,含义:

char A[50],*x;
gets(A);
x=&A[0];

据我了解,strlen(x)应该给我字符串的长度。

我的问题是,当我增加 x 时到底会发生什么?

最佳答案

首先,很抱歉离题了,但是请永远不要使用过时的 gets() 函数。请改用fgets

在回答您的问题时,如果x是指向有效非空字符串的指针,则strlen(x+1)将始终等于strlen(x) - 1.

假设我们有这个字符串,x 指向它:

     +---+---+---+---+---+---+
  a: | H | e | l | l | o | \0|
     +---+---+---+---+---+---+
       ^
       |
   +---|---+
x: |   *   |
   +-------+

x指向字符串的第一个字符。现在,strlen 所做的只是从指向的字符开始并对字符进行计数,直到找到终止的 '\0'

因此,如果我们递增x,现在它会指向'e'(即,它指向字符串“ello”),如下所示:

     +---+---+---+---+---+---+
  a: | H | e | l | l | o | \0|
     +---+---+---+---+---+---+
           ^
           |
          /
         /
        /
       |
   +---|---+
x: |   *   |
   +-------+

因此 strlen 的长度将减少 1。

<小时/>

脚注:我想起了我不止一次遇到的一个有趣的错误。当您使用malloc为字符串分配空间时,您始终必须记住为终止'\0'添加空间。只是不要这样做:

char *p = malloc(strlen(str + 1));

我的同事曾经这样做过一次(不,真的,那是一个同事,不是我!),并且很难追踪,因为很容易看到有错误的代码而看不到它事实并非如此

char *p = malloc(strlen(str) + 1);

本来应该如此。

关于c - 当我在增加指针后使用 strlen() 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470139/

相关文章:

c - 将 for 循环中的值存储到数组中?

java - 按字母顺序对对象数组进行排序

python - 多维数组的就地改组

c++ - 字符串转char*函数

c - 将 C 语言转换为 MIPS 代码(了解 MIPS 中的内存访问)

c - 我的老师做了这个功能,但我不明白它有什么用

c - 数据包中的奇怪字符

arrays - matlab数组赋值

无法找出这里指针的错误吗?

c - 指针数组(指向结构)