2016-10-29 4 views
1

반 고정, 반 동적 크기 문자열 배열을 초기화하는 방법이 있습니까? 방법?반 고정, 반 동적 배열

예 :

char **p[2]; 

/*Memory allocation here*/ 

strcpy(p[0][0], "foo"); 
strcpy(p[0][1], "bar"); 
strcpy(p[1][0], "baz"); 
strcpy(p[1][1], "qux"); 
+1

예, 방법이 있습니다. – melpomene

+0

'초기화'라고 할 때 '변수 정의의 일부로 초기화'또는 '변수 정의 뒤에 여러 문으로 데이터 구조 만들기'를 의미합니까? 후자는 당신이 묘사하는 것이지만 C에서 '초기화'가 의미하는 것이 아닙니다. 또한 변수 부분이고보기에서 고정 부분입니까? –

+0

@JonathanLeffler 실제로 변수 정의 예에서 true 나도 몰라. 하지만 초기화하는 방법과 메모리를 할당하는 방법을 의미합니까? 나는 분명히 희망한다. – Pareidolia

답변

3

예, 방법이있다. C99에서 복합 리터럴을 사용하여

p[0] = malloc(sizeof(char *) * 2); //Two pointers in p[0] 
p[1] = malloc(sizeof(char *) * 2); //Two pointers in p[1] 

p[0][0] = malloc(sizeof(char) * 4); //4 bytes in p[0][0] 
p[0][1] = malloc(sizeof(char) * 4); 
p[1][0] = malloc(sizeof(char) * 4); 
p[1][1] = malloc(sizeof(char) * 4); 
+1

'sizeof (char)'는 정의상 1입니다. – melpomene

+0

예 그렇지만 그가 유형을 바꾸기로 결정하면 그 사람을 속일 수 있습니다 –

+1

그럴 경우 어쨌든'p [0] [0] = malloc (4 * sizeof * p [0] [0])' 모든 유형과 함께 작동합니다. – melpomene

2

, 당신은 그림과 같이 변수 p을 초기화 할 수 있습니다 :

extern char **p[2]; 

char **p[2] = (char **[2]){ 
    (char *[2]){ "foo", "bar" }, 
    (char *[2]){ "baz", "qux" }, 
}; 

extern 라인은 헤더에 갈 것; 나머지는 p을 정의하는 소스 파일에 있습니다. 또는 extern 행을 사용하지 않고 static char **p[2] = …으로 만들 수 있습니다. 이는 p이 전역 변수의 형편없는 이름이기 때문에 아마 더 좋습니다.

(char **[2]){ … } 부분은 p과 동일한 유형의 복합 문자입니다. 안에는 2 개의 (char *[2]){ … } 단위가 있으며 배열은 2 char *입니다.

가리키는 문자열은 수정할 수 없습니다. 수정이 가능하면 더 열심히 일해야합니다 (그러나 완료 할 수 있습니다).

이 테스트 코드가 작동하는지 보여줍니다

#include <stdio.h> 

int main(void) 
{ 
    for (int i = 0; i < 2; i++) 
    { 
     for (int j = 0; j < 2; j++) 
      printf("[%s]", p[i][j]); 
     putchar('\n'); 
    } 
    return 0; 
} 

출력 : 당신은 런타임에 있어야 두 문자열의 배열에 대한 포인터의 시간 배열을 결정하려면

[foo][bar] 
[baz][qux] 

(따라서 어느 시점에 { "abc", "def" }{ "pqr", "xyz" }을 추가 할 수 있습니다.) 동적 메모리 할당을 위해 들어가야하지만, 고정 된 문자열 목록이 없을 것입니다. 당신은 (설정?) 파일 또는 비슷한 것으로부터 읽을 것입니다.

+0

하나님은 객체 지향 프로그래밍을 축복하셨습니다. – Pareidolia