다음 코드에서는 strncpy()
을 사용하여 10 자 길이의 char * str에 문자열을 복사합니다.문자열이 NULL로 끝나지는 않지만 여전히 정상적으로 작동합니다. 이유가 무엇입니까?
이제 strncpy()
설명서에 따르면 "경고 : src의 첫 번째 n 바이트 중 null 바이트가 없으면 dest에 배치 된 문자열은 null이 종료되지 않습니다."이것은 정확히 여기서 발생합니다.
소스 문자열의 길이는 26 charcters이고 10 문자를 복사 했으므로 null 문자는 str의 끝에 배치됩니다.
그러나 str의 내용을 출력 할 때 '\ 0'이 될 때까지 0부터 시작하여 정상적으로 작동합니다.
왜? 끝 부분에 '\ 0'이없는 경우 루프가 올바른 위치에 멈춰있는 이유는 무엇입니까?
내가 알기로는 "Segmentation fault"를 제공해야하며, 적어도 멈추지 말고 일부 쓰레기 값을 계속 인쇄해서는 안됩니다. 어떤 도움을 이해할 것이다
str[ 0 ] has got : a str[ 1 ] has got : b str[ 2 ] has got : c str[ 3 ] has got : d str[ 4 ] has got : e str[ 5 ] has got : f str[ 6 ] has got : g str[ 7 ] has got : h str[ 8 ] has got : i str[ 9 ] has got : j
: 여기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
char *str ;
str = malloc(sizeof(char) * SIZE);
if(str == NULL)
exit(1);
memset(str, 0, sizeof(char) * SIZE);
strncpy(str, "abcdefghijklmnopqrstuvwxyz", sizeof(char) * SIZE);
unsigned int index;
for(index = 0; str[ index ] != '\0' ; index++) {
printf("str[ %u ] has got : %c \n ", index, str[ index ]);
}
return 0;
}
가 출력된다.
편집
확인하는 적절한 방법이 있나요 문자열은 '\ 0'여부에 종료 여부? 나는 항상 위의 루프가 궁극적 인 테스트라고 생각했지만 지금은 그렇지 않다.
다른 프로그래머가 개발 한 함수에서 문자열을 얻을 수 있습니다. 이제 '\ 0'으로 올바른 위치에서 끝나는 것을 어떻게 알 수 있습니까? 5 월이되지 않으면 실제 크기를 넘어서서 '\ 0'을 얻을 것입니다. 문자열의 실제 크기를 결코 알 수 없습니다.
그런 상황을 어떻게 해결할 수 있습니까?
의견이 있으십니까?
sizeof (char) is * always * 1 !! – paxdiablo
@Pax : 사실,하지만 여기에 대한 설명이 있습니다. http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-when-manipulating-memory – sharptooth
strncmp는 문자열의 크기가 아니라 문자의 수이기 때문에 거기서 사용하는 것은 잘못입니다. –