2012-09-18 3 views
0

이 프로그램을 중단시키는 동안 printf("%s/%s\n", str1, str2);이 문자열을 출력 할 때 간과 할 수있는 간단한 것이 있습니까?sprintf segfault printf가 괜찮은 동안

이것은 VirtualBox에서 실행되는 우분투 (최신 릴리스)에서만 발생합니다. Windows (호스트)에서 두 행은 문제없이 실행됩니다.

더 많은 상황이 필요하면 알려주세요. 내가 놓친 어리석은 일이 있었으면 좋겠다. 그리고 그 두 줄은 충분하다.

+4

'str3'은 어떻게 선언됩니까? 얼마나 많은 문자를 저장할 수 있습니까? 특히 'strlen (str1) + strlen (str2) + 1 + 1' 문자를 저장할 수 있습니까? – hmjd

+0

'str3'은'char *'입니다 – calccrypto

+3

어떻게 초기화합니까? – hmjd

답변

6

차이점은 printf()이 표준 출력에 쓰고 있고 sprintf()이 버퍼 str3에 쓰고 있다는 것입니다. str3이 결과 문자열을 포함 할 정도로 크지 않으면 정의되지 않은 동작이며 충돌의 원인 일 수 있습니다.

str3은 정확히 NULL이 아니거나 초기화되지 않았으며 strlen(str1) + strlen(str2) + 2자를 저장할 충분한 공간을 지정해야합니다. + 2/이고 끝 null 문자입니다. 예 :

char* str3 = malloc(strlen(str1) + strlen(str2) + 2); 
if (str3) 
{ 
    sprintf(str3, "%s/%s", str1, str2); 
}