2016-11-03 2 views
-4

코드가 제대로 작동해야하므로 작동합니다.C 포인터 차이 Char Int

void TstPointer(int *Pointer) 
    { 
     *Pointer = 3; 
    } 

    int main() 
    { 
     int number = 1; 
     int *ptr = &number; 

     TstPointer(ptr); 

     printf("%d\n", number); 
    } 

하지만 형식을 char로 전환하면 작동하지 않습니다.

void TstPointer(char *Pointer) 
{ 
    *Pointer = "Hell1"; 
} 

int main() 
{ 
    char *Hello = "Hello"; 
    TstPointer(Hello); 
    printf("%s\n", Hello); 
} 

경고 : 할당 캐스트없이 포인터의 정수를 만드는 [-Wint 변환] * 포인터 = "Hell1";

+0

'H''가 문자 ('char') 인이,' "Hell1는"의'입니다 - – BeyelerStudios

+1

초보자 수준의 C 프로그래밍 책에서 포인터와 문자열이 어떻게 작동하는지 연구하십시오. – Lundin

답변

0

컴파일러가 *Pointer = "Hell1";하는 동안 경고했습니다. 아마도 undefined behavior을 호출하는 것을 무시하기로 선택했습니다. 일반적으로

, 당신은 변경할 수 없습니다 것 리터럴 문자열 Pointer 점으로, 문제를, 포인터에 복사 strcpy()를 사용하지만이 경우, 그 원인이됩니다합니다.

메모리 위치가 인 경우 을 쓰기 전에 메모리에 쓰기가 가능한지 확인해야합니다. 메모리 할당 자 함수를 사용하거나 배열을 만들고 포인터가 배열의 시작을 가리 키도록하십시오.

0

TstPointer 메서드에서 *Pointer = "Hell1";을 수행하면 경고가 생성됩니다.

Pointer이 char 포인터 인 경우 *Pointer이 char 변수이기 때문입니다. 그리고 당신은 잘못된 char 변수에 문자열 상수를 할당하고 있습니다.

이 문제를 해결하려면 main에있는 포인터의 주소를 전달할 때 함수 매개 변수에 이중 포인터를 사용해야한다고 생각합니다!

편집 :

당신이 변수 (일반적으로 문자 포인터 나 배열)에 문자열 상수를 할당 할 때 때문에이 경고를 받고, 그 상수 문자열의 시작 부분의 변수 저장 주소를 입력합니다. 이제 lvalue가 char 포인터 타입이 아니고 단지 char 변수 일 때, "암시 적 변환"이 발생하여 "char"변수에 "address"를 할당 (fit)합니다. 그러나 우리는 char이 메모리 주소를 수용 할 수 없다는 것을 알기 때문에 보통 인쇄 할 때 segfault가 발생합니다!

int *ptr = &number; TstPointer(ptr);

+0

또는 strcpy (포인터, "Hell1"); – Turtle

+0

@skrtbhtngr expected 'char **'하지만 인수는 'char *'유형입니다. void TstPointer (char ** Pointer) –

+0

주 TstPointer (& Hello);에서. – skrtbhtngr

0

는 방법 ( &Hello)는 INT와 마찬가지로에 Hello의 참조를 전달 문자열 (`char`의 배열)
+0

'void TstPointer (char ** Pointer) { \t * 포인터 = "Hello"; \t } int 주() { \t char * Hello = "Hello World"; \t TstPointer (& Hello); \t printf ("% s \ n",여보세요); }'그래서 여기 어떻게 당신의 대답에 따라 그것을 해결 thks들! –