2015-02-07 2 views
-1
#include <stdio.h> 
void fun(char**); 

int main() 
{ 
    char *argv[] = {"ab", "cd", "ef", "gh"}; 
    fun(argv); 
    return 0; 
} 
void fun(char **p) 
{ 
    char *t; 
    t = (p+= sizeof(int))[-1]; 
    printf("%s\n", t); 
} 

할당 t = (p + = sizeof (int)) [- 1]; .. 주어진 ans는 cd입니다.누군가가이 할당, 이중 포인터 및 출력을 설명 할 수 있습니까?

+0

을 찾을 수 있습니다, 솔직한 조언 마일을 실행하는 것입니다. – NPE

+0

p가 int의 크기만큼 증가하면, 바로 앞에있는 인덱스를 선택하여 역 참조됩니다. 프로그램이 실제로 음의 배열 인덱스를 수행 할 수 없기 때문에 이것은 기술적으로 정의되지 않은 동작입니다. –

+0

물론 음수 인덱스를 사용할 수 있습니다. 음의 색인을 추가하면 유효한 포인터가됩니다. – gnasher729

답변

0

이 코드는 독자 혼동을 유발하기위한 용도로 작성된 것입니다. 그것을 설명하면 잘못 작성된 코드를 이해하는 것을 배우지 못하기 때문에 실제로 도움이되지는 않습니다.

코드는 아마도 sizeof (int)가 2 일 때 8 비트 및 16 비트 컴퓨터 시간으로 작성되었을 것입니다. sizeof (int) = 2로 가정하고 코드 단계를주의 깊게 살펴보십시오. 단계별로.

+0

젠장, 더블 포인터가 무엇을하는지 말해 주시겠습니까? @ gnaher –

+0

@SivaPraveen : 단일 포인터와 같지만, 포인터. – Deduplicator

+0

@ Siva Praveen : 독립적 인 개념으로 "이중 포인터"같은 것은 없습니다. "더블 포인터"는 단지 하나의 일반 포인터입니다. pointee가 포인터 일뿐만 아니라 우연히 발생했습니다. – AnT

0

정말 나쁜 코드입니다. p가 처음으로 2 씩 증가하고 p [0]에서 p [2]로 설정되기 때문에 대답은 "cd"입니다. 그런 다음 1 씩 감소되고 문자열 "cd"를 가리키는 p [1]로 설정됩니다. 문자열 "cd"자체가 포인터를 생성하기 때문에 이중 포인터입니다.

답변은 시스템에 따라 다르며 대부분의 시스템에서는 p [3]을 가리 킵니다.

나는이 코드가 당신을 혼란스럽게 만들기에 동의합니다.

0

는 초기에는 더 **pargv[0] 소자 "ab" 즉 .IT의 어드레스가 최종적 "cd" 가리키는 .so는 다음 -1만큼 감소가 "ef" .IT 가리 부탁해2(2 바이트로 주어진 INT의 크기)만큼 증가 포함 . t의 값을 "cd"으로 인쇄합니다. 즉 어떤 종류의 교육 과정에서 실제 할당, 그리고 대답이 cd` '로 적혀 있다면,

당신은 내 대답 here

관련 문제