간단한 소스인데 이해가 잘안가서요

ch0nn0m의 이미지

이해가 잘 안가는 부분은...
memcpy(buf,fp+2,(sp - fp)-2);
여기에서 fp에서 sp를 빼는게 아닌가요??

#include <stdio.h> 
 
int main() 
{ 
    char *hello = "aaa::data::bbb\0"; 
    char *org = hello; 
    char *fp; 
    char *sp; 
 
    char buf[10] = {'\0',}; 
 
    fp = strstr(hello, "::");       
    printf("%s\n",fp);          // fp는 ::data::bbb를 가리킨다. 
 
    sp = strstr(fp+2, "::");  // fp+2 는 data::bbb 이다. 
    printf("%s\n",sp);         // 그러므로 sp는 ::bbb가 된다. 
 
    memcpy(buf,fp+2,(sp - fp)-2); // fp+2는 data::bbb 이다. 
                                                    // sp - fp 는 6이다. 여기에는 "::"도 포함되어 있으므로 -2를 해준다. 
                                                    // 결국 data::bbb 에서 4만큼으 크기의 데이터를 buf에 복사한다. 
 
    printf("%s\n",buf);                  // 그러므로 data가 출력된다. 
} 
klara의 이미지

"aaa::data::bbb\0"의 제일 첫글자의 주소를 0이라고 생각하고 fp와 sp의 값을 계산해보면 답이 나올 것같습니다.
참고로 큰따옴표로 적는 문자열상수의 경우 \0을 굳이 안적어도 맨뒤에 자동으로 \0이 들어갑니다.

kkn1380의 이미지

이해가 잘 안가는 부분은...
memcpy(buf,fp+2,(sp - fp)-2);
여기에서 fp에서 sp를 빼는게 아닌가요??
라고 하셨는데 당연히 sp-fp가 맞습니다.
각각 데이터들을 보면
sp = ::bbb
fp = ::data::bbb
라고 되어 있지만 sp와 fp는 포인터 변수로 각각의 주소값을 갖고 있는겁니다.
예를 들어 hello가 "aaa::data::bbb\0"이지만 이건 text영역에 들어 있는 "aaa::data::bbb\0"의 첫번째 주소값을 hello가 갖고 있다는 의미이고
만약 그 값이 0이었다면 fp는 3, sp는 9의 주소를 가지고 있는 것입니다.
a a a : : d a t a : : b b b
0 1 2 3 4 5 6 7 8 9 10 11 12 13
질문하신 분은 텍스트의 길이로 계산하는것을 생각하신것 같은데 그렇다면
strlen(fp) - strlen(sp) 로 계산해야 합니다.
C에서 string을 어떻게 다루는지 이해가 필요할 것 같습니다 ^^