0

我对实施中的下一个声明有点困惑:

void add(char *prefix[NPREF], char *suffix) {
    State *sp;

    sp = lookup(prefix, 1);
    //addsuffix(sp, suffix);

    printf("size of prefix %d",&prefix);
    printf("size of prefix %s", prefix + 1);
    printf("size of prefix %d \n", &prefix+1);
    for (int i = 0; i < NPREF; i++)
        printf("%s \n" , prefix[i]);


    printf("memmove \n");

    memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
    prefix[NPREF - 1] = suffix;

    for (int i = 0; i < NPREF; i++)
        printf("%s \n", prefix[i]);

}

mmemove(前缀, 前缀 + 1, (NPREF - 1) * sizeof(prefix[0]));

所以prefix是一个char类型的指针。在这个术语中,前缀 + 1 是指向数组中下一个字符的链接,不是吗?

它是如何以正确的方式工作的?我已经阅读了 memmove 并阅读了指针,但无法为自己探索这个添加函数的行为。

4

2 回答 2

1

所以 prefix 是一个类型的指针char。在这个术语prefix + 1中是指向数组中下一个的链接char,不是吗?

不,是的。prefix不是指向 的指针,而是指向 的指针char数组。这个数组的大小是NPREFchar

assert(sizeof(prefix) == NPREF * sizeof(char*)

并且是prefix + 1之后的下一个元素的地址,&prefix[0]因为prefix(这是数组)衰减为指向数组第一个元素的指针。所以

memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));

mommove NPREF - 1元素按一个位置。考虑到马尔可夫链是什么,这听起来很合理,尽管我们看不到您的实现。如果它改为写成

memmove(&prefix, &prefix + 1, sizeof(prefix)/sizeof(prefix[0]);

然后它将memmove整个数组。

例子:

[0][1][2][3][4][5]...[n] /* prefix was */
[A][B][C][D][E][F]...[N]
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
[0][1][2][3][4][5]...[n] /* prefix is */
[A][A][B][C][D][E]...[M]
于 2016-07-11T09:09:50.237 回答
0

memmove将 n-1 个指针向后移动一步。

考虑一下,因为memcpy它在 2 个不同的数组上运行:

prefix
 V    
[ ][ ][ ][ ][ ][ ]
 ^  ^  ^  ^  ^
 \  \  \  \  \
  \  \  \  \  \
   \  \  \  \  \
    \  \  \  \  \
[ ][ ][ ][ ][ ][ ]
    ^
    prefix+1
于 2016-07-11T09:12:14.143 回答