C에서 문자열 배열을 만드는 방법은 여러 가지가 있습니다. 모든 문자열의 길이가 동일하거나 최소한 최대 길이가 같은 경우 char의 2 차원 배열을 선언하고 필요에 따라 지정하면됩니다.
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
이니셜 라이저 목록도 추가 할 수 있습니다.
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
이니셜 라이저의 문자열 크기와 개수가 배열 차원과 일치한다고 가정합니다. 이 경우 각 문자열 리터럴 (자체는 0으로 끝나는 char 배열)의 내용이 strs에 할당 된 메모리에 복사됩니다. 이 접근법의 문제점은 내부 단편화 가능성입니다. 5 자 이하인 99 개의 문자열이 있지만 20 자 길이의 1 개의 문자열이있는 경우 99 개의 문자열은 15 개의 사용하지 않은 문자를 갖습니다. 그것은 공간 낭비입니다.
char의 2 차원 배열을 사용하는 대신 char에 대한 1 차원 배열의 포인터를 저장할 수 있습니다.
char *strs[NUMBER_OF_STRINGS];
이 경우 문자열에 대한 포인터를 보유하기 위해 메모리 만 할당했습니다. 문자열 자체의 메모리는 다른 곳에서 할당해야합니다 (정적 배열 또는malloc()
또는 calloc()
). 이전 예제와 같이 이니셜 라이저 목록을 사용할 수 있습니다.
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
문자열 상수의 내용을 복사하는 대신 단순히 포인터를 저장하면됩니다. 문자열 상수는 쓰기 가능하지 않을 수 있습니다. 다음과 같이 포인터를 다시 할당 할 수 있습니다.
strs[i] = "bar";
strs[i] = "foo";
그러나 문자열의 내용을 변경하지 못할 수도 있습니다. 즉,
strs[i] = "bar";
strcpy(strs[i], "foo");
허용되지 않을 수 있습니다.
malloc()
각 문자열에 버퍼를 동적으로 할당하고 해당 버퍼에 복사하는 데 사용할 수 있습니다 .
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
a를 char의 14 요소 배열에 대한 포인터의 2 요소 배열로 선언합니다.
char (*a[2])[14]
의 경우 14 문자 배열에 대한 두 개의 포인터 배열입니다.