`strcpy(x+1, SEQX)` 是做什么的?

What does `strcpy(x+1, SEQX)` do?

我想知道 strcpy() 的语法在第 65 行和第 66 行中的作用:

 24 #define SEQX "TTCATA"
 25 #define SEQY "TGCTCGTA"
 61   M = strlen(SEQX);
 62   N = strlen(SEQY);
 63   x = malloc(sizeof(char) * (M+2)); /* +2: leading blank, and trailing [=10=] */
 64   y = malloc(sizeof(char) * (N+2));
 65   strcpy(x+1, SEQX);            /* x_1..x_M now defined; x_0 undefined */
 66   strcpy(y+1, SEQY);            /* y_1..y_N now defined; y_0 undefined */

我知道它正在将 SEQXSEQY 复制到 xy 但我不明白 +1 是做什么的?这种操作的正式名称是什么?

strcpy(x+1, SEQX); 将 SEQX 复制到 x 缓冲区,但保留第一个字节不变。在评论中它说:/* +2: leading blank, and trailing [=12=] */。故意跳过。

这是分配缓冲区的结构:

+---+---+---+---+---+---+---+
| x |x+1|x+2|x+3|...|   |   |
+---+---+---+---+---+---+---+

pointer + offset 表示法用作引用内存位置的便捷方式。

在您的例子中,pointermalloc() 在分配足够的堆内存后提供,并表示类型为 charM + 2 个元素的数组,因此您的代码中使用的符号表示以下地址:

<x + 1 * sizeof(char)>

这也恰好与:

&x[1]

也就是x[1]的地址(x的第二个元素)。在 strcpy() 操作之后,内存将如下所示:

[0] [1] [2] [3] [4] [5] [6] [7]
??? 'T' 'T' 'C' 'A' 'T' 'A' '[=12=]'
^
x

换句话说:

strcmp(x + 1, SEQX) == 0

注意在实际使用x作为字符串之前,应该定义第一个内存位置,即

x[0] = '='; // now the string holds "=TTCATA"