2017-12-07 4 views
-2

궁금이를 strncpy 동작은

char *data = 0; 
char data2[20] = "Hello"; 

strncpy(data, data2, 10); 

그러나 Visual Studio에서 난 당신이 내가 볼 수 있듯이이

char *data = malloc(20); 
char data2[20] = "Hello"; 

strncpy(data, data2, 10); 

을 할 필요가 그렇지 않으면 Visual Studio에서 malloc()을 사용해야합니다. 메모리에 대한 액세스 위반이 발생하지만, 왜 Eclipse에서 필요하지 않습니까? 대부분의 경우를 들어

+2

제 니펫 리드 [* * 정의되지 않은 행동 (https://en.wikipedia.org/wiki/Undefined_behavior). 이야기의 끝. –

+1

미안하지만 나는 정말로 didnt한다. 만약 내가 알기를 간절히 바란다면 ... 대답 – user3660570

+0

@Someprogrammerdude 아래 답변에서와 같이 이것이 UB 인 이유를 설명하는 것이 더 도움이 될 것입니다. –

답변

2

,

char *data = 0; 

char *data = NULL; 

다음, 당신이 NULL 포인터를 사용하고 (즉, 무효 주소 당신 '과 동일 strncpy()의 대상이되는 액세스)을 가정하지 마십시오. 그것은 C11undefined behavior

정교 장 §7.1.4, 라이브러리 함수의 사용이다

[...] 함수의 인수가 잘못된 값 (예로서 가지고 있다면 함수 또는 null 포인터 또는 해당 매개 변수가 const 한정되지 않은 경우 수정 불가능한 저장 장치에 대한 포인터)의 도메인 외부에있는 값 또는 값이거나 프로그램의 주소 공간 외부에있는 포인터 유형 (promotio 후 n) 인수가 가변적 인 함수에 의해 예상되지 않는 경우 동작은 정의되지 않습니다.가 [...]

+1

기술적으로 UB 일지라도, CDT와 segfault하지 않는다는 것은 여전히 ​​이상합니다. –

+0

@MichaelWalz 글쎄, 모든 사람들 중에서, 당신은 UB의 아주 아름다운 측면을 잘 알고 있습니다. :) –