2011-08-31 7 views
1

안녕하세요 내가의 strcpy 및 strcat와 원인 문제는 때때로

char *str ; 

     strcpy(str, "\t<"); 
     strcat(str, time); 
     strcat(str, ">["); 
     strcat(str, user); 
     strcat(str, "]"); 
     strcat(str, "("); 
     strcat(str, baseName); 
     strcat(str, ") $ "); 

     printf("\String is now: %s\n", str); 

이 코드가 작동 보이지만 내가 엑스 코드를 사용할 때 기능을 분석 아래와 같은 코드를 가지고, 또한 "함수 호출 인수가 초기화되지 않은 값"을 말한다 때로는 프로그램이 다운되는 경우가 있습니다. 제거하면 문제가 없습니다 ... 뭐가 잘못 되었나요? 감사합니다

+2

str에 대한 메모리를 할당 했습니까? –

+0

왜 그렇게 중요한가요? – kanoz

+2

@kanoz : 합법적으로 할당 된 메모리 외에는 쓸 수 없기 때문에 중요합니다. – sharptooth

답변

2

strcpystrcat은 문자열을 할당 된 char 배열에 복사하고 연결하는 데 사용됩니다.

str 초기화되지 않았으므로 메모리에 어딘가에 쓰고 있기 때문에 다른 데이터가 손상되어서 좋지 않습니다. 그 순간에 작동하지만 조만간 프로그램이 중단됩니다. STR를 선언 할 때

당신은 메모리를 할당해야합니다 : 그것은 어디 CONCATENATE의 문자를 알고 문자열 끝을 검색 할 필요가로

char str[100];

는 또한, strcat이 효율적이지 않습니다. sprintf를 사용하면보다 효율적으로 될 것이다 : 당신이 배열을 맞는 생성 된 문자열을 보장 할 수없는 경우

sprintf(str, "\t<%s>[%s](%s) $ ", time, user, baseName);

마지막으로, 당신은 더 나은 사용 snsprintf을 것입니다.

2

메모리를 할당하지 않고 str을 초기화하지 않은 상태로 둡니다. 이후의 모든 쓰기는 "어딘가"를 가리키는 초기화되지 않은 포인터를 통해 이루어지며 이는 정의되지 않은 동작입니다.

당신은 결과 문자열을 보관 유지하는데 충분한 크기의 메모리 할당 (이후 무료)해야한다 :

char *str = malloc(computeResultSizeSomehow()); 
if(str == 0) { 
    // malloc failed - handle as fatal error 
} 

//proceed with your code, then 

free(str); 
+0

어떻게 해결할 수 있습니까? – kanoz

+0

@ kanoz : 무엇을 고쳐 주시겠습니까? – sharptooth

+0

computeResultSizeSomehow() 란 무엇입니까? – kanoz

1

이것은을 간단 많은 오류가없는 버퍼 오버 플로우에서 :

#define BUFFERSIZE 512 
char str[BUFFERSIZE]; 

snprintf(str, BUFFERSIZE, "\t<%s>[%s](%s) $ ", time, user, baseName); 
+0

문제가 인쇄되지 않습니다. 다른 곳에서 내'str'을 사용해야합니다 ... – kanoz

+0

sprintf는 모니터에서가 아니라 문자열로 "인쇄합니다". –

+0

@wormsparty 고정 크기 배열을 의미합니까? 아니면 snprintf? 왜냐하면 첫 번째 제약 만 있기 때문입니다. –