`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 */
我知道它正在将 SEQX
和 SEQY
复制到 x
和 y
但我不明白 +1
是做什么的?这种操作的正式名称是什么?
strcpy(x+1, SEQX);
将 SEQX 复制到 x 缓冲区,但保留第一个字节不变。在评论中它说:/* +2: leading blank, and trailing [=12=] */
。故意跳过。
这是分配缓冲区的结构:
+---+---+---+---+---+---+---+
| x |x+1|x+2|x+3|...| | |
+---+---+---+---+---+---+---+
pointer + offset
表示法用作引用内存位置的便捷方式。
在您的例子中,pointer
由 malloc()
在分配足够的堆内存后提供,并表示类型为 char
的 M + 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"
我想知道 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 */
我知道它正在将 SEQX
和 SEQY
复制到 x
和 y
但我不明白 +1
是做什么的?这种操作的正式名称是什么?
strcpy(x+1, SEQX);
将 SEQX 复制到 x 缓冲区,但保留第一个字节不变。在评论中它说:/* +2: leading blank, and trailing [=12=] */
。故意跳过。
这是分配缓冲区的结构:
+---+---+---+---+---+---+---+
| x |x+1|x+2|x+3|...| | |
+---+---+---+---+---+---+---+
pointer + offset
表示法用作引用内存位置的便捷方式。
在您的例子中,pointer
由 malloc()
在分配足够的堆内存后提供,并表示类型为 char
的 M + 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"