2014-04-01 3 views
0

두 디스플레이 23. 그러나 둘의 차이점은 무엇입니까?두 코드 스 니펫의 차이점은 무엇입니까?

코드 1

main() 
{ 
    int *ar[10]; 

    **(ar+0) = 23; 
    printf("%d", **(ar+0)); 

    return 0; 
} 

코드 2

main() 
{ 
    int *ar[10]; 

    *(ar+0) = (int*) malloc(sizeof(int)); 
    **(ar+0) = 23; 
    printf("%d", **(ar+0)); 

    return 0; 
} 
+1

좋은 숙제 질문 : – blue

+1

첫 번째 코드 ** (ar + 0) = 23; [정의되지 않은 동작] (http://en.wikipedia.org/wiki/Undefined_behavior) –

+0

어떻게 생각하십니까? 당신이 그들을 실행할 때 어떻게됩니까? 그 중 하나가 잠재적으로 컴퓨터가 충돌하고 화상을 입을 수 있다고 생각하는 이유는 무엇입니까? – Lundin

답변

1

첫번째는 정의되지 않은 동작이다. a은 정수에 대한 10 개의 포인터 배열로 정의되지만 쓰기에서 첫 번째 포인터 (a[0])를 사용하기 전에 포인터를 초기화하지 않습니다. 이것은 정의되지 않은 동작입니다.

두 번째 것은 먼저 malloc() (really bad cast)의 반환 값으로 포인터를 설정하여 UB를 호출하지 않을 가능성이 더 큽니다. 물론 할당에 실패하여 NULL을 반환하면 정의되지 않은 동작이 다시 발생합니다.

+0

I (int *) malloc() 캐스트를 사용할 수 없습니까 ?? –

+0

이게 낫니? main() { \t int * ar [10]; \t \t ar [0] = malloc (sizeof (int)); \t * ar [0] = 5; \t printf ("% d", * ar [0]); \t return 0; } –

+1

@DaveBlack'malloc()'의 반환 값을 캐스팅하는 것에 대한 링크를 클릭 했습니까? 아니, 나는 그것이 받아 들일 수 있다고 생각하지 않는다. 그리고 예, 캐스트가없는 변형은 당연히 더 좋습니다. 유형의 반복을 제거하려면'ar [0] = malloc (sizeof * ar [0]); '을 사용하는 것이 더 낫습니다. 또한 거의 메모리를 할당하지 않습니다. – unwind

3
int *ar[10]; 
**(ar+0) = 23; 

정의되지 않은 동작 (일부 "임의의"메모리 23를 할당)이 23 INT 요소를위한 공간을 할당하지 않기 때문에 (ar 포인터의 배열)입니다.


INT의 * 아칸소 [10]; (ar + 0) = (int) malloc (sizeof (int)); printf ("% d", ** (ar + 0)); 이 int가 초기화되지 않기 때문에 상기 제 ar 소자에서 int위한

메모리를 할당하지만, 해야 인쇄 "가비지".

질문이 편집되고 초기화가 추가됨에 따라 두 번째 버전은 완벽하게 양호합니다 (malloc이 성공한 경우).


*(ar+0) 두 샘플이 처음 10 정수 포인터 배열을 지정 ar[ 0 ]

+0

답변을 업데이트하십시오. 질문이 호환되지 않는 방식으로 업데이트되었습니다. –

+0

@mic_e - 감사합니다. –

+1

Note : 구현은'malloc()'이 성공했을 때만 파일이다. –

0

동일하다.

그런 다음 첫 번째 샘플은 첫 번째 포인터에 값을 쓰고 심지어 할당하지 않고 계속됩니다. 이것은 정의되지 않은 동작이며 대부분 segfault입니다.

두 번째 샘플은 첫 번째 포인터에 대한 메모리를 할당 한 다음 거기에 값을 씁니다. 그것은 행동을 완벽하게 정의했습니다. 즉, malloc()이 성공하면 확인해야합니다.

관련 문제