반 고정, 반 동적 크기 문자열 배열을 초기화하는 방법이 있습니까? 방법?반 고정, 반 동적 배열
예 :
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");
반 고정, 반 동적 크기 문자열 배열을 초기화하는 방법이 있습니까? 방법?반 고정, 반 동적 배열
예 :
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");
예, 방법이있다. 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);
, 당신은 그림과 같이 변수 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" }
을 추가 할 수 있습니다.) 동적 메모리 할당을 위해 들어가야하지만, 고정 된 문자열 목록이 없을 것입니다. 당신은 (설정?) 파일 또는 비슷한 것으로부터 읽을 것입니다.
하나님은 객체 지향 프로그래밍을 축복하셨습니다. – Pareidolia
예, 방법이 있습니다. – melpomene
'초기화'라고 할 때 '변수 정의의 일부로 초기화'또는 '변수 정의 뒤에 여러 문으로 데이터 구조 만들기'를 의미합니까? 후자는 당신이 묘사하는 것이지만 C에서 '초기화'가 의미하는 것이 아닙니다. 또한 변수 부분이고보기에서 고정 부분입니까? –
@JonathanLeffler 실제로 변수 정의 예에서 true 나도 몰라. 하지만 초기화하는 방법과 메모리를 할당하는 방법을 의미합니까? 나는 분명히 희망한다. – Pareidolia