2017-11-18 5 views
-3

전문가 글쓴이가 주어진 프로그램의 결과물을 쓰도록 요청한 책 "Let us C"에 주어진 질문이 있습니다. 내 GCC 컴파일러에 그것을 시도 IS-글자 포인터와 문자열

#include<stdio.h> 
int main() 
{ 
    char s[]="Churchgate: no church no gate"; 
    char t[40]; 
    char *ss,*tt; 
    ss=s; 
    while(*ss!='\0') 
     *tt++=*ss++; 
    printf("%s\n",t); 
    return 0; 
} 

프로그램, 출력은 코어 덤프이었다. 이유를 설명해주세요. 여기에는 ss와 tt가 문자 포인터입니다. 여기서도 문장 ss = s의 의미가 무엇인지 이해하지 못합니다. 문자로 문자를 복사하지 않으면 문자열을 직접 복사 할 수 없다는 뜻입니다. ss는 문자 포인터이므로 ss = s는 무엇을 의미합니까? 그것은 주소가 s의 ASCII 값인 바이트를 가리키고 있음을 의미합니까? 또한이 문장을 이해할 수 없습니다. * tt ++ = * ss ++. 그것에 대한 단서가 없습니다. 그 의미를 자세히 설명해주십시오.

다음은 printf ("% s \ n", t)가 문자 유형이지만 문자가 프로그램에 따라 저장되지 않는 이유를 이해할 수 없습니다.

+1

'tt'는 아무데도 가리키고 있지 않습니다. – coderredoc

+2

어쩌면 당신은'tt = t'; 그리고 나서'* tt = '\ 0'' – coderredoc

+0

또한 들여 쓰기 :( –

답변

0

첫 번째 것 먼저 ' 배열 이름은 첫 번째 요소의 주소를 보유하는 포인터 일뿐입니다. 그래서,

char s[]="Churchgate: no church no gate"; 

여기서 s는 포인터 이름입니다. 그리고 문자열의 'C'주소를 보유합니다. 이제 문자 유형 인 ss라는 또 다른 포인터를 선언했습니다.

so, ss = s; ss가 s가 보유하고있는 주소도 보유하고 있음을 의미합니다.

아무 것도 저장하지 않으므로 쓰레기가 인쇄됩니다. 마찬가지로 포인터 tt는 초기에 임의의 주소 (가비지)를 저장하지 않습니다. 마지막으로 가장 중요한 것은 입니다.이 작업을 수행 할 수 없습니다 : * tt ++ = * ss ++; 아마도 당신은 좌변의 오류를 보여줍니다.