2014-04-09 5 views
2

는 그 같은 문자열 선언 할 때 :메모리 할당

char string[] = "Hello"; 

그것은 사실에 equivilant있다 - 그래서

char string[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 

스택에 메모리에 의해 문자열에 할당 된 그것 선언.

char *string = "Hello"; 

변수 '문자열'문자열의 첫 글자 'H'는 메모리에있는 주소를 포함 : 그 같은 문자열을 선언 할 때 그러나 발생합니다.

  1. 문자열이 메모리에있는 위치는 어디입니까? 스택 \ 힙 \ 등.

  2. 문자열에 메모리가 자동으로 할당되었거나 메모리 (예 : malloc)를 문자열에 할당해야합니까? 그리고해야한다면 어떻게 할 수 있습니까 (저는 약간의 코드 예제를 원합니다)?

제 질문에 대한 답변이 시스템에 따라 다름을 알리고 싶습니다. 그렇다면이 사실을 기록하고 인기있는 플랫폼 (Windows, Linux 등)에서 발생하는 상황에 따라 대답 해보십시오.

+1

가능한 복제본 http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c – tesseract

+0

@tesseract 생각합니다. 감사합니다 :) – Programmer

+1

여기에 중요한 테이크 어웨이는'char string [] = "hello"'할 수 있습니다'string [0] = 'm''을'mello'로 만들 수 있지만'char * string = "hello"'문자열은 컴파일러에 의해 읽기 전용 메모리에 저장되면 string [0] = 'm''할 수 없습니다. – tesseract

답변

1

char *string = "Hello";의 문자열이 저장되는 위치는 정의되어 있지 않습니다. 실제로는 프로그램의 코드가 저장되는 텍스트 세그먼트라는 읽기 전용 메모리에있는 경우가 많습니다. 포인터는 정의가 함수 내부인지 함수 외부인지에 따라 '스택'또는 데이터 세그먼트에 저장됩니다.

문자열에 메모리를 할당하기 위해 아무 것도 할 필요가 없습니다.

답변은 시스템에 따라 다르지 않습니다 (단, 시스템은 편리한 위치에 문자열을 저장할 수 있으며 다른 시스템에서는 다른 위치에 저장할 수 있음).

+0

고맙습니다. 답변을 수락했습니다. :) – Programmer

+1

또한 상수 문자열에 사용되는 메모리는 (항상 그런 것은 아니지만) 자주 읽기 전용으로 설정된다는 점에 유의하십시오. 이러한 문자열에 쓰려고하면 일반적으로 segfault가 발생합니다. 이를 반영하기 위해, 그러한 문자열에 대한 포인터는'const char *'; 이것을'char *'에 캐스팅하면 경고가 생성됩니다! – duskwuff

+0

@duskwuff 고마워, 좋은 습관. – Programmer