2012-12-25 3 views
2

전역 포인터 (char*)을 정의합니까? 그런 다음 상수 문자열의 주소를 지정하십시오. 이 주소는 해제됩니까? 예를 들어 :전역 메모리에 로컬 상수 문자열이 있습니까

static char *str;  
const char * test() 
{ 
    str = "hello world"; 
    return str; 
} 

Q1은 : 지금은 안전 어디서나 test에 의해 얻을 주소의 내용을 사용하는 것입니다.
질문 2 :test이 DLL에있는 경우. 다른 프로그램에서 옆으로 사용하는 것이 안전합니까?
Q3 : 안전한 경우. 다른 const 문자열을 변수 str에 재 할당 할 때. 이전 const 문자열을 해제 할 수 있습니까?

답변

1

다음을 수행하면 foo() 결과를 아무 곳이나 사용할 수 있습니다. 그러나 수정하거나 해제해서는 안됩니다. 이 코드가 DLL 또는 라이브러리의 일부인 경우에는 관계가 없습니다.

const char * foo() { 
    return "hello"; 
} 

// This is identical. 
const char * foo() { 
    const char *x = "hello"; 
    return x; 
} 

수정하려는 경우 다음과 같이 할 수 있습니다. foo()을 호출 할 때마다 x이 정적이기 때문에 동일한 메모리를 참조하게됩니다. 여기에서 x을 수정할 수 있지만 여전히 해제하면 안됩니다. 당신이 foo()의 결과를 확보 할 수 있기를 원하는 경우

char * foo() { 
    static char x[] = "hello"; 
    return x; 
} 

, 당신은 malloc()으로 공간을 할당해야합니다.

+0

다른 const 문자열을 변수'str'에 재 할당 할 때. 이전의 const 문자열은 해제됩니다. – Samuel

+0

아니요. 힙에 할당 된 메모리는'free()'메모리에만 있습니다. ''hello ''는 힙에 저장되지 않습니다. 정적 인 메모리에 저장됩니다. –

+0

'str'을 재 지정하면 정적 메모리 부분의''hello "'문자열을 가리키는 포인터가 없습니다. 이전 문자열이 여전히 정적 메모리 조각에 저장되어 있으면 정적 조각 메모리가 낭비됩니다 – Samuel

1

코드 측면에서만 볼 때 안전합니다. 하지만 test()에서 str에 문자열 const 만 할당 할 수 있는지 확인해야합니다. 다음과 같이하면 :

const char *test() { 
    char somestr[somesize]; 
    str = somestr; 
    return str; 
} 

여전히 안전하지 않습니다.

+0

테스트가 DLL에있는 경우. 다른 프로그램에서 사용하는 것이 안전합니까? – Samuel

+0

예, DLL에서는 여전히 안전합니다. – TieDad

0

str에 대한 지정이 필요하지 않습니다. 이를 사용하지 않아도 함수에서 문자열 리터럴의 주소를 반환하고 그 후 어디에서나 문자열을 사용하는 것이 안전합니다.

0

그것은 당신이 포인터에 문자열 리터럴을 할당하면 안전하지만 전체 화면에서 기능을 두는 것이 가장 것 같아 그렇게 할 거라면 그런 다음

static char str[] = "hello world"; 

배열은 포인터에 부패하기 때문에 static char *과 같이 str을 사용할 수 있습니다.

관련 문제