2012-12-12 5 views
1

는 내가 C99 프로그램을 작성하기 위해 노력하고있어 나는 암시과 같은 정의 된 문자열 배열이 : 배열의 크기부터C99에서 암시 적으로 정의 된 다차원 배열에 메모리가 어떻게 할당됩니까?

char *stuff[] = {"hello","pie","deadbeef"}; 

정의되지 않은, 얼마나 많은 메모리가 각 문자열에 할당된다? 모든 문자열은 정의에서 가장 큰 문자열과 동일한 양의 요소가 할당됩니까? 예를 들어, 다음의 코드는, 상기 암시 적 정의에 해당 될 것이다 :

char stuff[3][9]; 
strcpy(stuff[0], "hello"); 
strcpy(stuff[1], "pie"); 
strcpy(stuff[2], "deadbeef"); 

또는하면이 정의시 필요 메모리 단지 양 할당 된 각각의 캐릭터 (즉, stuff[0]6 요소들의 어레이를 보유 stuff[1]은 의 배열을 가지며 배열은 요소입니다.

+1

배열은 포인터로 붕괴합니다. 그러나 그것들은 같은 것이 아닙니다! –

답변

10

그림이 도움이됩니다 - ASCII 아트는 재미 있지만 (힘들지 만). 포인터의 1D 배열에 할당

char *stuff[] = {"hello","pie","deadbeef"}; 

+----------+   +---------+ 
| stuff[0] |--------->| hello\0 | 
+----------+   +---------+  +-------+ 
| stuff[1] |-------------------------->| pie\0 | 
+----------+   +------------+ +-------+ 
| stuff[2] |--------->| deadbeef\0 | 
+----------+   +------------+ 

메모리는 연속이지만, 포인터 (포인터 라인 길이가 서로 다른 이유입니다) 메모리의 연속 된 부분에 배열 점에서 개최 않는다는 보장은 없습니다.

char stuff[3][9]; 
strcpy(stuff[0], "hello"); 
strcpy(stuff[1], "pie"); 
strcpy(stuff[2], "deadbeef"); 

+---+---+---+---+---+---+---+---+---+ 
| h | e | l | l | o | \0| x | x | x | 
+---+---+---+---+---+---+---+---+---+ 
| p | i | e | \0| x | x | x | x | x | 
+---+---+---+---+---+---+---+---+---+ 
| d | e | a | d | b | e | e | f | \0| 
+---+---+---+---+---+---+---+---+---+ 

2 차원 배열에 할당 된 메모리는 연속적입니다. x는 초기화되지 않은 바이트를 나타냅니다. stuff[0]은 'hello'의 'h'에 대한 포인터이고, stuff[1]은 '파이'의 'p'에 대한 포인터이고, stuff[2]은 'deadbeef'의 첫 번째 'd'에 대한 포인터입니다 (그리고 stuff[3]은 'deadbeef'이후의 널 바이트 이후의 바이트에 대한 비표준 포인터).

사진이 상당히 다릅니다. 당신이 중 하나를 쓸 수 있었다

참고 :

char stuff[3][9] = { "hello", "pie", "deadbeef" }; 
char stuff[][9] = { "hello", "pie", "deadbeef" }; 

및 (x 및의가 제로 것이라고 제외) 2 차원 배열 그림과 같이 동일한 메모리 레이아웃을 가질 것이다.

+1

그냥 아름다워. –

+0

이것은 메모리에서 일어나는 일에 대한 훌륭한 설명입니다! 누구든지이 동작이 C99 표준에 설명되어있는 곳으로 참조를 가지고 있습니까? –

+1

6.2.6 유형의 표현. –

2

첫 번째 예에서는 지그재그 배열입니다.

char에 대한 const 포인터의 배열을 선언합니다. 따라서 문자열 리터럴은 원하는만큼 길어질 수 있습니다. 문자열의 길이는 이고 배열 열은입니다.

두 번째 경우 행 당 문자 수 (string)는 열 크기에 지정된 9 자 이하 여야합니다.

0

모든 문자열에 정의에서 최대 문자열과 동일한 양의 요소가 할당 되었습니까?

아니요. 포인터는 3 개만 할당되며 3 개의 문자열 리터럴을 가리 킵니다.

char *stuff[] = {"hello","pie","deadbeef"}; 

char stuff[3][9]; 

모두 동등에 노출되지 않습니다. 첫 번째는 3 개의 포인터의 배열이고 두 번째는 2D 배열입니다.

첫 번째 포인터는 할당되며 포인터가 가리키는 문자열 리터럴은 읽기 전용 섹션에 저장 될 수 있습니다. 두 번째는 자동 저장 장치 (일반적으로 스택)에 할당됩니다.

4
char *stuff[] = {"hello","pie","deadbeef"}; 

하지 다차원 배열 입니다! 이것은 단순히 포인터 배열입니다.

각 문자열에 할당되는 메모리 용량은 어떻게됩니까?

문자 수에 널 종료자를 더한 것입니다. 문자열 리터럴과 동일합니다.

다음
char foo[][10] = {"hello","pie","deadbeef"}; 

(10)는 스트링 당 공간의 크기이며, 모든 문자열은 연속 메모리에 있습니다

난 당신이 원하는 생각합니다.따라서 크기가 10보다 작은 문자열에 대해서는 패딩이있게됩니다.

관련 문제