I. char *str = "Stack";
II. char *str = (char*) malloc(6);
strcpy(str, "Stack");
위의 두 가지 방법의 차이점은 무엇입니까?선언 된 문자열과 할당 된 문자열의 차이점
커튼 뒤에서 동일하거나 다른 것이 있습니까?
I. char *str = "Stack";
II. char *str = (char*) malloc(6);
strcpy(str, "Stack");
위의 두 가지 방법의 차이점은 무엇입니까?선언 된 문자열과 할당 된 문자열의 차이점
커튼 뒤에서 동일하거나 다른 것이 있습니까?
위의 코드는 문제를 일으킬 수 있습니다.
첫 번째 인스턴스를 정적 문자열 할당 및 정의라고합니다. 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일 접근
참조
<http://en.wikipedia.org/wiki/Data_segment>
<http://en.wikipedia.org/wiki/Code_segment>
첫 번째 경우 포인터는 프로세스 메모리의 읽기 전용 부분에 할당 된 const char*
을 가리 킵니다.
두 번째 경우에는 동적으로 메모리를 할당하고 "스택"문자열을 할당 된 메모리에 복사합니다.
free
을 사용하여 메모리를 II에서 릴리스해야합니다.
그리고 내가 읽기 전용 영역 (첫 번째 경우)에 쓰려고하면 어떻게됩니까? – VishalDevgire
'const char *'- 상수 문자열이므로 할 수 없습니다. 컴파일러가이 작업을 수행하지 못하도록합니다. –
당신은 오신 것을 환영합니다. 처음에는 알아 내기가 쉽지 않습니다 ... –
스택 내부에 저장하는 것에 대한 주장이 틀린 다른 답변은 잊어 버리십시오. (우 이제 그 답이 제거 된 ..)
case I:
당신은 그 내용이 "Stack"
을하는 읽기 전용 메모리 영역합니다 (.rodata
절)을 가리키는 포인터 str
있습니다.
case II:
당신은 수정할 수 있으며 사용 후 free(str)
을 invocking에 의해 해제되어야합니다 내용이 "Stack"
이다 (힙) 동적으로 할당 된 영역을 가리키는 포인터 str
을 보유하고 있습니다.
감사합니다. – VishalDevgire
또한 변형을 추가 할 것입니다 :'char str [] = "Stack"'... –
@ValeriAtamaniouk 그리고 올바른 것입니다. 우울해 할 것입니다. 나를 상기시켜 줘서 고마워. – DevNull