2017-01-14 3 views
-1

나는이 기능이 있습니다오류 ++ 기능

char* return_string(){ 
    char buffer[] = "Hi world!"; 
    return buffer; 
} 

bool test08() 
{ 
    char compare[] = "Hi world!"; 
    int result = strcmp(compare,return_string()); 
if (result == 0) return true; 
return false; 
} 
int main() 
{ 
if(test08) printf("\nTRUE"); 
else printf("\nFALSE"); 
} 

c++ Shell이 코드 실행이하고 V codeblocks하지 않는 이유를 13.12 (분할 오류). "

char* return_string(){ 
    char buffer[] = "Hi world!"; 
    return buffer; 
} 

복사 문자열 안녕 세상 : 내가 char *buffer=;char buffer[]= 선언을 변경하면 내가 ++ (알 쉬운) 그래서

+1

정의되지 않은 동작입니다. 로컬 변수에 대한 포인터를 반환하고 있습니다. –

+0

관련없는 언어의 태그는 스팸하지 마십시오. – Olaf

답변

1

다만 다음과 같은 방법

const char* return_string(){ 
    const char *buffer = "Hi world!"; 
    return buffer; 
} 

원래 기능 구현에 대한 문제 함수 return_string 변경 어레이 buffer이 종료 한 후 살아있는 없습니다 자동 저장 기간이 함수의 로컬 배열 있다는 함수.

수정 된 함수에는 정적 저장 기간이있는 문자열 리터럴이 사용됩니다. 따라서 문자열 리터럴의 첫 번째 문자에 대한 포인터를 반환 할 수 있습니다.

기능 test08return_string의 범위에 정의 된 지역 변수 buffer에 간단

bool test08() 
{ 
    char compare[] = "Hi world!"; 
    return strcmp(compare, return_string()) == 0; 
} 
1

이 ... 분명히하십시오 C에서 초보자 해요 작동합니다 ! " 로컬 변수 buffer에 저장 한 다음 해당 지역 변수를 반환합니다. 함수 종료시 버퍼가 삭제되므로 해당 반환 값을 사용하려고하면 정의되지 않은 동작이 발생합니다.

이 : 아마 당신이 원하지 않는 것을 불구하고

char* return_string(){ 
     char *buffer = "Hi world!"; 
     return buffer; 
    } 

실제로 확인 될 것입니다. 당신은 문자열 리터럴 (수수께끼의 장소에 저장되어있는 표준 문자열)의 시작 주소를 반환 할 것입니다. C++에서는 const에 문제가 있습니다.

1

함수 return_string가 반환 포인터를 쓸 수 있습니다. 함수가 돌아 오면 buffer이 저장된 주소를 반환하지만 그 주소에 저장된 값은 더 이상 유효하지 않습니다. 글쎄, 당신은 문자에 대한 포인터를 반환 고집, 당신은 동적으로 "안녕하세요"를 할당 할 수 있으며, 나중에를 무료로 기억 : 메모리 이후

char * return_string() { 
    char local_var[] = "hello world"; 
    char *buffer = (char *) malloc(sizeof(local_var)); 
    strcpy(buffer, local_var); // we know that buffer is big enough to hold local_var 
    return buffer; 
} 

에 "Hello World"저장이되지 않는 함수에 로컬 인 경우 함수가 종료 될 때 해제되지 않습니다.

또 다른 (더 나은) 해답은 정적으로 할당 된 buffer (귀하의 가치를 담을 수있을만큼 충분히 컸음)을 return_string에 전달하고 그 내용을 수정하는 것입니다.

void return_string(char *buffer, size_t buffer_size) { 
    strncpy(buffer, "hello world", buffer_size); 
} 
0

버퍼에 포인터를 반환하고 있지만 버퍼 변수는 함수가 반환 된 후에 소멸됩니다.

버퍼 변수를 정적으로 만들어야합니다.

0

이것은 답변이지만 여전히 ...
CodeBlocks 16.01 (mingw)을 사용해 보았는데 모든 것이 원활하게 작동합니다. 빠른 제안, 항상 업그레이드 된 버전의 소프트웨어로 작업 해보십시오. 특히 학습 과정에있는 경우 더욱 그렇습니다.

+0

이것은 코드가 잘못되어도 실수로 * "정의되지 않은 동작"*이 발생하는 전형적인 경우입니다. 버그를 식별하는 것이 훨씬 어렵습니다. – merlinND

+0

C++은 이런 식으로 작동하지 않습니다. 그것이 작동하는 것만으로도 코드가 "ok"라는 것을 의미하지는 않습니다. 지역 변수의 주소를 반환하는 것은 그 동작이 무엇인지에 관계없이 정의되지 않은 동작입니다. 그것은 작동 할 수도 있고, 실패 할 수도 있고, 다른 옵션으로 컴파일하면 실패 할 수도 있고, 오늘 작동하거나, 내일 실패 할 수도 있습니다. – PaulMcKenzie