그림이 도움이됩니다 - 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 차원 배열 그림과 같이 동일한 메모리 레이아웃을 가질 것이다.
배열은 포인터로 붕괴합니다. 그러나 그것들은 같은 것이 아닙니다! –