【问题标题】:Markov chain. Implementation add method马尔可夫链。实现添加方法
【发布时间】:2016-07-11 08:54:55
【问题描述】:

我对执行中的下一条语句有点困惑:

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(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));

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

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

【问题讨论】:

  • printf("前缀 %d 的大小",&prefix);错了
  • 我只是想得到答案。请不要关心我的 printf 功能。问题不在于它。

标签: c markov-chains memmove


【解决方案1】:

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

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

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

是的,prefix + 1&amp;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]

【讨论】:

    【解决方案2】:

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

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

    prefix
     V    
    [ ][ ][ ][ ][ ][ ]
     ^  ^  ^  ^  ^
     \  \  \  \  \
      \  \  \  \  \
       \  \  \  \  \
        \  \  \  \  \
    [ ][ ][ ][ ][ ][ ]
        ^
        prefix+1
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多