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

时间:2015-06-22 04:00:06

标签: c strcpy

我想知道第65行和第66行strcpy()的这种语法是什么:

 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 \0 */
 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是什么做?这种操作的正式名称是什么?

2 个答案:

答案 0 :(得分:7)

/* +2: leading blank, and trailing \0 */将SEQX复制到x缓冲区,但它保留第一个字节不变。在评论中说:+---+---+---+---+---+---+---+ | x |x+1|x+2|x+3|...| | | +---+---+---+---+---+---+---+ 。它是故意跳过的。

这是分配缓冲区的结构:

{{1}}

答案 1 :(得分:4)

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

在您的情况下,pointer在分配足够的堆内存后由malloc()提供,并表示M + 2类型为char的元素数组,因此符号为在您的代码中使用代表以下地址:

<x + 1 * sizeof(char)>

这也恰好与:

相同
&x[1]

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

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

换句话说:

strcmp(x + 1, SEQX) == 0

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

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