이것은 s2가 1문자로 구성된 배열임을 의미합니다. strcpy(s2, s1)와 유사한 경우; s1의 길이(이 경우 n)가 1보다 크면 배열 액세스가 범위를 벗어난 것입니다. 배열 액세스 범위 초과와 같은 오류의 경우 결과는 불확실하며, 범위 초과 후 액세스한 메모리 주소의 관련 속성에 따라 프로그램이 정상적으로 실행되거나 충돌할 수 있습니다.
s2를 동적 배열로 변경하면 프로그램이 정상적으로 실행됩니다. 코드는 다음과 같습니다:
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & ltstring.h & gt
void LoopMove(char *s, int n)
{
char * s 1;
int t 1 = strlen(s);
int t = strlen(s)-n;
char * S2 = (char *)malloc((t 1+1)* sizeof(char));//t1+1 문자를 할당합니다. 1을 추가하는 이유는 C의 문자열은 기본적으로 ' \0 '으로 끝나기 때문이며, strlen의 결과에는 이 ' \0 '이 포함되지 않습니다.
memset(s2, 0, t 1+1); // s2의 내용을 지웁니다
s 1 = s+t;
printf("%d\n", t);
strcpy(s2, s 1);
strncpy(s2+n, s, t);
strcpy(s, s2);
free(s2);//무료 자원
}
int main()
{
int n = 4;
char s[] = " hello";
char * p = NULL
LoopMove(s, n);
printf("%s\n", s);
}