. 이 선언은이 특정 프로그램에 대한 문제를 해결하는 것 :
char a[4], b[4];
을 당신이 당신의 목적지가 소스뿐만 아니라 null 종결을 수용 할 공간이 충분히이 있는지 확인해야하는 일반적인 경우.
이 예제는 어떤 일이 벌어지고 있는지 더 잘 이해할 수있게 해줍니다. 이는 데모 용 일 뿐이며, 이와 같은 코드를 다른 용도로 사용해야하지만 배워야합니다. 이 ideone
에 나를 위해 작동하고 당신은 here을 사는 경우에 볼 수 있지만 우리가 정의되지 않은 동작을 호출하기 때문에 다른 컴파일러에서 제대로 작동하지 않을 수 있습니다
#include <stdio.h>
#include <string.h>
int main()
{
char a[3], b[4];
// a will have a lower address in memory than b
printf("%p %p\n", a, b);
// "abc" is a null terminated literal use a size of 4 to force a copy of null
strncpy(a,"abc",4);
// printf will not overrun buffer since we terminated it
printf("a2 = %s\n", a);
// explicitly only copy 3 bytes
strncpy(b,a,3);
// manually null terminate b
b[3] = '\0' ;
// So we can prove we are seeing b's contents
b[0] = 'z' ;
// This will overrun into b now since b[0] is no longer null
printf("a2 = %s\n", a);
printf("b = %s\n", b);
}
감사합니다. 나는 알고 있어야 할 것이지만 문제의 근원이라면 나는 다른 오류를 겪었을 것이라고 생각했습니다. 당신 (또는 다른 사람)이 이것이 왜 특정 장소에서만 문제를 일으키는 지에 대해 더 많은 설명을 할 수 있습니까? (예를 들어 "abc"를 배열 'a'에 intially copy 할 때) –
@ liam-fisher 이유를 설명하기 위해 내 대답을 업데이트하겠습니다. –
@ liam-fisher는 처음에 'abc "배열에'a'를 지정합니다. 왜냐하면 여전히 버퍼 오버런이지만 코드에 다른 변수가 없으므로 사용중인 것은 메모리의'a' 바로 뒤에 있습니다. 그러나 이것은 여전히 메모리를 손상시키고 뒤에 코드에서 이상한 충돌과 같이 코드가 실행 된 후 이상한 행동을하게됩니다. –