2013-04-15 3 views

답변

16

위의 코드는 문제를 일으킬 수 있습니다.

첫 번째 인스턴스를 정적 ​​문자열 할당 및 정의라고합니다. int 등의 일반 변수와 문자열이 아닌 데이터 유형의 경우 이러한 선언은 스택에 데이터를 할당합니다. 문자열 리터럴 (예 : "stack")을 통해 문자열을 초기화하는 경우 메모리의 읽기 전용 부분에 할당됩니다.

문자열 자체는 메모리의 읽기 전용 부분에 저장되므로 수정하면 안됩니다. 포인터 자체는 새로운 위치를 가리 키도록 변경할 수 있습니다.

예 :

const char* str = "Stack"; // Same effect as char* str, but the compiler 
          // now provides additional warnings against doing something dangerous 

두 번째를 동적 할당으로 알려져 온 메모리를 할당 :

char strGlobal[10] = "Global"; 

int main(void) { 
    char* str = "Stack"; 
    char* st2 = "NewStack"; 
    str = str2; // OK 
    strcpy(str, str2); // Will crash 
} 

안전을 위해, 당신은 실제로 즉 const를 데이터에 대한 포인터로 할당해야 스택이 아니라 힙. 번거 로움없이 문자열을 수정할 수 있습니다. 어느 시점에서 free() 명령을 통해 동적으로 할당 된 메모리를 해제해야합니다.

스택에 정적 할당 인 문자열을 할당하는 세 번째 방법이 있습니다. 이렇게하면 문자열을 보유하고있는 배열의 내용을 수정할 수 있으며 정적으로 할당됩니다. 요약

char str[] = "Stack"; 

: 어떻게 데이터에

Example:      Allocation Type:  Read/Write: Storage Location: 
================================================================================ 
const char* str = "Stack";  Static    Read-only  Code segment 
char* str = "Stack";   Static    Read-only  Code segment 
char* str = malloc(...);  Dynamic    Read-write  Heap 
char str[] = "Stack";   Static    Read-write  Stack 
char strGlobal[10] = "Global"; Static    Read-write  Data Segment (R/W) 

또한 최대 읽어야 현대 운영 체제에서 응용 프로그램에 대한 분할된다. 코드 작성 방법에 대한 이해를 높이게됩니다.2013년 4월 15일 접근

참조


  1. 데이터 세그먼트, 2013년 4월 15일 접근, <http://en.wikipedia.org/wiki/Data_segment>
  2. 코드 세그먼트, <http://en.wikipedia.org/wiki/Code_segment>
+2

감사합니다. – VishalDevgire

+1

또한 변형을 추가 할 것입니다 :'char str [] = "Stack"'... –

+0

@ValeriAtamaniouk 그리고 올바른 것입니다. 우울해 할 것입니다. 나를 상기시켜 줘서 고마워. – DevNull

2

첫 번째 경우 포인터는 프로세스 메모리의 읽기 전용 부분에 할당 된 const char*을 가리 킵니다.
두 번째 경우에는 동적으로 메모리를 할당하고 "스택"문자열을 할당 된 메모리에 복사합니다.

free을 사용하여 메모리를 II에서 릴리스해야합니다.

+0

그리고 내가 읽기 전용 영역 (첫 번째 경우)에 쓰려고하면 어떻게됩니까? – VishalDevgire

+1

'const char *'- 상수 문자열이므로 할 수 없습니다. 컴파일러가이 작업을 수행하지 못하도록합니다. –

+1

당신은 오신 것을 환영합니다. 처음에는 알아 내기가 쉽지 않습니다 ... –

0

스택 내부에 저장하는 것에 대한 주장이 틀린 다른 답변은 잊어 버리십시오. (우 이제 그 답이 제거 된 ..)

case I: 당신은 그 내용이 "Stack"을하는 읽기 전용 메모리 영역합니다 (.rodata 절)을 가리키는 포인터 str 있습니다.

case II: 당신은 수정할 수 있으며 사용 후 free(str)을 invocking에 의해 해제되어야합니다 내용이 "Stack"이다 (힙) 동적으로 할당 된 영역을 가리키는 포인터 str을 보유하고 있습니다.

관련 문제