2009-12-25 4 views
0

다음 코드를 사용하여이 질문에 대한 대답을 찾으려고하지만 포인터의 값 (문제 3의 주소가 매개 변수에서 너무 멀리 떨어져 있음이 밝혀졌습니다. 대체 x = problem3; 포인팅되는 함수의 국소 변수) ...숫자 형 캐스팅 C

void problem3(int a) { 
    int overflowme[16]; 
    int x = problem3; 
    overflowme[15] = 102; 
    printf(" the address of x is %x\n the addres of the first local is %x\n the addres of the first para is %x\n ", x, &overflowme[15], &a); 
} 

int main(void) { 
    problem3(101); 
} 

OUTPUT 
the address of x is 42b613 
the addres of the first local is 12fed8 
the addres of the first para is 12fee4 
Press any key to continue . . . 
+1

여기서'overflowme'가 어떤 목적을 가지고 있는지 알지 못합니다. . –

+0

그리고 그것은'int main (void)'이어야합니다; 표준 C에서 main 함수는 int를 반환합니다. –

+0

무언가를 성취하려고하거나 C가 할 수있는 것을 실험하고 있습니까? – MatrixFrog

답변

2

당신은 우리가 모든 포인터는 수 problem3 함수 포인터 (함수의 즉, 메모리 주소)이기 때문에 위의 코드

에서 X = (int)를 problem3를 할당 할 수 및 이유를 설명 할 수 정수로 변환해라.

"hello world"를 x에 할당하지 않습니까? 당신이 (x = (int) "hello world";을 수행하여)에 원하는 경우에 "Hello World"가 적용되는 위의 포인터 (정확하게 할 수있는 문자 포인터)도, 그래서 때문에

번호 그러나 당신은 그렇게 할 수 있습니다.

+0

과제 전에 유형 3을 형 변환하지 않으면 어떻게됩니까? – user133466

+0

"캐스팅하지 않고 정수에서 포인터로 할당"과 같은 컴파일러 경고 (또는 오류?)가 발생할 수 있습니다. –

4

problem3가 함수에 대한 포인터이다. C에서 (int)과 같은 캐스트를 사용하면 컴파일러는 기본적으로 모든 유형 검사를 해제하고 수행중인 작업을 알고 있다고 가정합니다 (이 경우에는 의미가 없더라도).이 경우에는 포인터를 정수.

결론 - 정말 필요한 경우가 아니라면 캐스트를 사용하지 마십시오.

+0

imit은 혼란 스럽습니다 ... 어떻게 problem3이 포인터가 될 수 있습니까? 우리는 int * problem3 ... – user133466

+0

을 선언 한 적이 없으며 포인터가 int 유형보다 큰 경우 주소를 잘랐을 것입니다. 64 비트 플랫폼 – Anycorn

+2

함수의 이름은 해당 함수를 가리키는 포인터입니다. –

0

먼저 함수 호출을 수행하려면 problem3;에 괄호가 없습니다. 둘째, x = (int)problem3을 할당하면 problem3 함수의 주소가 x에 할당되고 int로 캐스트됩니다. 이것은 당신이 성취하려고하는 것이 확실하지 않더라도, C에서하는 것은 매우 합법적 인 일입니다.

캐스팅 된 함수의 주소를 int로 출력하고 16 진수로 형식을 지정하면 함수의 주소가 16 진수로 인쇄됩니다. 그 숫자가 7 자리라는 것에 놀란 이유가 확실하지 않습니다.

+0

첫 번째 의견을 다루기 위해 편집 한 질문입니다. 토론중인 문제와 관련성이 없으므로. –

0

첫 번째 예에서는 problem3 함수의 주소를 x에 할당 한 다음 해당 주소의 값을 인쇄합니다.

int으로 전송하는 것은 일반적으로 전혀 쓸모가 없습니다. 함수의 실제 메모리 주소를 알 필요는 거의 없습니다.

함수의 주소를 가져 오려는 경우는 코드의 다른 부분으로 전달하여 함수를 호출 (실행)해야하는 경우입니다. 함수 포인터 사용에 대한 자세한 내용은 this article을 확인하십시오.

0

기능 주소 ("problem3"및 "main")를 인쇄하고 있습니다. 이러한 주소는 전적으로 컴파일러 및 구현에 따라 다르므로 현재 직면 한 6 자리와 7 자리의 차이입니다.

1

캐스팅 (캐스팅) (어떤 것의 앞에 (int)을 넣었을 때 당신이하고있는 일은 마법 같은 방식입니다). 그것은 어떤 종류의 것을 취해서 어떤 종류의 다른 것으로 바꾸어 줄 것입니다 (이 경우에는 int). 다른 방법이 없다고 확신 할 수 없다면 캐스팅을 사용하지 않는 것이 좋습니다.

프로그램의 코드는 변수와 마찬가지로 메모리에 있습니다.여기서 일어나는 일은 코드가 메모리에있는 곳을 나타내는 숫자를 정수로 변환하는 것입니다. 이 정수는 컴파일러와 링커가 함수의 코드를 저장하기로 결정한 메모리 위치에 따라 더 크거나 더 작을 수 있습니다.

귀하의 printf 성명서는 전혀 지정이 없습니다. %x은 "printf에 전달 된 매개 변수 중 하나를 가져 와서 여기에 인쇄하십시오."라고 말하는 자리 표시 자입니다. 그것이 'x'라는 사실은 프로그램의 변수 이름과 아무 관련이 없습니다. 'x'가 말하는 것은 "기본베이스 10 (hexadecimal) 대신이 정수를 인쇄하십시오."입니다. ". %u 또는 %d을 넣으면 여전히 작동하며 부호없는 정수 10 진수 또는 부호가있는 10 진수로 표시되는 숫자를 얻습니다.