2016-07-11 5 views
0

있어서 추가마르코프 체인. 구현 I 구현에서 다음 한 Statment와 약간 혼란이다

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 (접두사 [0]));

그래서 prefix는 char 유형의 포인터입니다. 이 용어에서 접두사 + 1은 배열의 다음 문자에 대한 링크입니다. 그렇지 않습니까?

정상적으로 작동하는 방식은 무엇입니까? memmove에 대해 읽었고 포인터에 대해 읽었지만이 함수를 직접 탐색 할 수는 없습니다.

+0

의 printf ("프리픽스 % (D)의 크기", 프리픽스); 틀렸어 – 4pie0

+0

나는 대답을 얻으려고하고있다. 내 printf 기능에 신경 쓰지 마라. 질문은 그것에 관한 것이 아닙니다. –

답변

1

그래서 prefix는 char 유형의 포인터입니다. 이 용어로 prefix + 1은 이고 다음 배열은 배열 char에 연결되어 있지 않습니까?

아니오 및 예. prefixchar에 대한 포인터가 아니며, char에 대한 포인터는 NPREF의 포인터입니다. 이러한 어레이의 크기는

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

하고 있음 prefix + 1 어레이의 첫 번째 요소 포인터 붕괴 &prefix[0] (배열이다) 때문에 prefix 후 다음 요소의 어드레스이다. 그래서

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

것 한 위치로 mommoveNPREF - 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] 
+0

오, 정말 고마워. 너는 내 하루를 보냈다. –

0

memmove는 n-1 개의 포인터를 한 단계 후방으로 이동한다.

2 개 개의 다른 배열에 동작하는 memcpy 인 제 2 대를 고려

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