2013-05-20 2 views
3

이 코드를 고려하십시오.문자열 및 배열 이해

int main() 
{ 
    char *s, *t; 

    s = malloc(4 * sizeof(char)); 
    strcpy(s, "foo"); 
    t = s; 
    printf("%s %s\n", s, t);   // Output --> foo foo 
    strcpy(s, "bar"); // s = "bar" 
    printf("%s %s\n", s, t);   // Output --> bar bar 
} 

2 문자열 st있다. 먼저 s"foo"으로 설정 한 다음 ts으로 지정합니다. 문자열을 인쇄하면 foo foo이됩니다.

그런 다음 "bar"에서 s까지 복사하고 다시 인쇄하면 bar bar이됩니다.

이 경우 t의 값이 변경되는 이유는 무엇입니까? (내가 "bar"s에 복사 한 이유는 t이었습니다). 이 코드는 나에게 foo foobar foo을 제공

int main() 
{ 
    char *s, *t; 

    s = malloc(4 * sizeof(char)); 
    strcpy(s, "foo"); 
    t = s; 
    printf("%s %s\n", s, t); // Output --> foo foo 
    s = "bar" 
    printf("%s %s\n", s, t); // Output --> bar foo 
} 

-


는 지금은 strcpy(s, "bar")s = "bar"에 변경할 때.

왜이 경우 변경되지 않았습니까?

+3

** 사회자 참고 ** : 멋진 게임. 주제에 대한 의견을 유지하십시오 (즉, 설명을 요구해야 함). 이 질문의 장점에 대한 토론을 원하면 [here] (http://meta.stackoverflow.com)로 이동하십시오. –

+1

질문의 두 번째 부분을 삭제했습니다. 계속 묻고 싶다면 별도의 게시물을 만드십시오. 게시물 당 단 하나의 질문 만해야합니다. – sashoalm

답변

12

이 어떤 일이 일어날 수 있음을 의미하는 undefined behaviour입니다 : s가 초기화되지 않은 포인터이기 때문에 strcpy()

char *s, *t; 
strcpy(s, "foo"); 

메모리에 임의의 위치로 쓰고있다.


(정의되지 않은 동작 수정 편집 후)

질문 1 - 않는 이유는이 경우 t 변화의 가치인가? (나는 "bar"를 왜 바뀌지 않았다.)에 복사했다. malloc()이었다 이전 s에 할당 된 동일한 메모리를 가리키는

t = s; 

결과 모두 ts :

포인터 할당입니다. 해당 메모리에 대한 변경 사항은 ts을 통해 볼 수 있습니다.

질문 2 - 두 번째 경우에는 왜 변경되지 않습니까?

이는 s"bar" 리터럴 문자열의 주소를 할당 :

s = "bar"; 

는 이제 ts 같은 메모리 위치를 가리 키지 않습니다. tmalloc()이고 s에 할당 된 메모리를 가리 킵니다 ( t = s; 포인터 할당으로 인해).

strcpy()=매우 다른 : 첫 번째 인자

  • 할당, =에 의해 지정된 메모리 주소에

    • strcpy() 복사 문자, 포인터는
  • +0

    자, 이제 malloc이 생겼어. 여전히 같은 문제 야. – ShuklaSannidhya

    +0

    그리고 왜 두 번째 경우에 변경되지 않았습니까? – ShuklaSannidhya

    +0

    그래서 문자열 리터럴을 만들 때마다 메모리에 새 위치가 만들어 집니까? 's = "bar"'와 같이, 새로운 위치에''bar "'를 만들고 나서''s''에 할당합니까? – ShuklaSannidhya

    2
    을 보유하고있는 주소를 변경
    strcpy(s, "foo"); 
    

    사본메모리 위치에 대한은 s을 가리킴 t = s; 지금, 따라서 동일한 위치 , 동일한 출력 ts 두 점은

    지금, 당신은 sbar를 복사합니다. ts은 모두 같은 위치를 가리 킵니다. 따라서 같은 결과가 다시 나타납니다. 이 라인의 모든 개까지


    당신은 bar 문자열 상수를 만들

    s = "bar" 
    

    동일합니다. 그리고 주소를 s에 지정하십시오. 그것의 pointer 그것은 모든 메모리 위치를 가리킬 수 있습니다. 꼭 원래의 것은 아닙니다. 이제

    , bar

    s 점은 처음에 가리키는 이전 위치에 따라서 출력에 여전히 t

    2

    다음과 같이 될 수 이해하는 간단한 방법 : -

     s = malloc(4 * sizeof(char)); // this will be interpreted as follows 
         s = 123 ------------>| | | | | //some garbage values at these location 
              123 124 125 126 // some random address chosen. 
    
         strcpy(s, "foo") ; // it copies at the address provided by s i.e. 
              |'f'|'o'|'o'|'\0'| 
               123 124 125 126 
    
         t = s;  this statement means t it pointing to address = 123 
    
         strcpy(s, "bar"); // this statement copies at given address it means it will override previous value . i.e 
              |'b'|'a'|'r'|'\0'| 
              123 124 125 126 
    

    이제 주소 123을 가리키며, 그 이유는 t, s 두 줄 모두를 인쇄합니다.

    이제는 s가 321의 값을 가지지 만 t는 값 123을 가지므로 s와 t는 다른 값을 제공합니다.