2017-09-04 1 views
0

sprintf()를 사용하여 문자열을 채 웁니다.하지만 끝나지 않았을 때, 뭔가 이상한 변수를 발견했습니다. 변수 이름 테스트도 수정할 수 있습니다. 함수를 호출 할 때 Rvalue와 같았습니다. , 또는 여기에 내가 눈치 채지 못한 곳이 있으며, 다음은 제 코드와 출력물입니다.sprintf() 함수에서 변수를 수정합니까?

감사합니다.

ABC 
ABC 
hi e 
0061FF10 
hi e 
0061FF27 
+2

다른 경우에는'test' 변수에'str' 변수의 주소를 넣는 것입니다. 다른 변수 - 주소가 다릅니다. –

+1

'& str'은 예상 할 수없는 값입니다 ...'char str [9]'는 실제로'char * str'입니다. – Jarod42

+0

배열은 함수로 포인터로 전달됩니다. 귀하가 시연하는 것처럼 포인터가 가리키는 내용을 수정할 수 있습니다. 이것은 기본적인 C 이론 (및 실습)입니다. 놀랄 일이 없어야합니다. –

답변

2

포인터를 함수에 전달하면 메모리 위치에서 값이 변경됩니다. 포인터를 전달할 때 포인터의 또 다른 복사본이 만들어지고 함수에서 사용됩니다. (함수를 호출 할 때마다 변수 복사본이 만들어지고 해당 복사본 변수에 대한 연산이 수행됩니다). 여기서 변수는 포인터 타입이므로 다른 포인터 변수가 생성되어 테스트에 의해 지시 된 것과 동일한 메모리 위치를 가리 키지 만 다른 주소를 갖게됩니다. 그래서 두 개의 다른 포인터의 주소를 인쇄 할 때 두 개의 다른 메모리 주소가 인쇄됩니다.

+0

@ Feng.Ma 함수에서 함수가 이미 관심 포인터를 전달했기 때문에'&'를 제거하십시오. 그래서 printf ("% s \ n % p \ n", str, str);'당신이하고있는 일은 포인터 자체의 값이 아닌 함수 인자의 주소 (아마도 스택상의 위치)를 출력하고있다. . 실제로'printf ("% s \ n % p \ n", str, (void *) str);가 더 정확합니다. –

+0

오케이, 알았어. 열쇠는 패스 패트릭이다. 대답 해줘서 고마워. –

3

#include <stdio.h> 
#include <stdlib.h> 

void Encap(char str[9]) 
{ 
    printf("%s\n", str); 
    sprintf(str, "hi e"); 
    printf("%s\n%p\n", str, &str); 
} 

int main() 
{ 
    char test[9] = "ABC"; 

    printf("%s\n", test); 
    Encap(test); 
    printf("%s\n%p\n", test, &test); 

    system("pause"); 
    return 0; 
} 

출력 당신은 배열 test을 선언하고 함수 Encap에 전달합니다. 당신이 배열의 내용을 수정, 기능 Encap

  1. : 귀하의 질문이 좀 불분명하지만, 당신을 놀라게 할 수있는 두 가지가있다.
  2. Encap 함수가 호출 한 후에 test 배열에 대한 수정 사항이 계속 유지됩니다.

는 (당신은 또한 중요한 개념이 될 수있다 "를 rvalue"에 대해 질문, 그러나 당신이 예상 한대로 여기에 적용되지 않습니다.)

이유는이 그것을 수행하는 방법입니다 작동 때문에 서로 다른 두 가지 :

  1. 당신이 기능 Encap에 배열 test을 통과

    , 당신은 배열의 전체 가치를 전달하지 않습니다. 실제로 전달 된 것은 첫 번째 요소 인 배열에 대한 포인터입니다.
  2. Encap 함수 내에서 전달 된 포인터를 수정하지 않고 대신 포인터가 가리키는 메모리를 수정하고 있습니다. 포인터를 값 (포인터 값)으로 사용하여 메모리를 수정해야하는 위치를 확인하면 test 어레이가 최대 main()이됩니다.
+0

그는 초보자를위한 책을 필요로하지 않으므로 그는 설명을 읽지 않고 –

+0

기초 지식을 알지 못합니다. 그러나 나는 초보자들에게 인내심을 가져 주셔서 감사합니다. –

관련 문제