2012-07-24 5 views
2

C 문자열 배열에 메모리를 할당하려고합니다. 문자열이 MAX_STRING_LENGTH 자 이내로 들어간다는 것을 보증 할 수 있지만 배열에 얼마나 많은 문자열이 있는지 컴파일 타임에 알지 못합니다 (동적으로 계산 됨). 코드를 사용할 때 ...임의 길이의 고정 길이 C 문자열 배열에 메모리를 할당하는 방법

char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings); 

... 컴파일러는 유효하지 않은 초기화 프로그램이라고 불평합니다. 코드를 사용할 때 ...

char strings[MAX_STRING_LENGTH][] = malloc(sizeof(char *) * numstrings); 

... 컴파일러는 불완전한 요소 유형에 대해 불평합니다. 내가 여기서 잘못하고있는 것은 무엇이며 어떻게이 배열에 메모리를 할당 할 수 있습니까?

char **strings = malloc(sizeof(char*) * numstrings); 
for (int i = 0; i < numstrings; i++) 
    strings[i] = malloc(MAX_STRING_LENGTH); 

하나의 덩어리에 모두 할당하는 것도 가능은 다음 할당 (쉽게 확보하게) : 그것은 진정으로 동적 인 경우

+0

당연히, 나는 항상'char **'를위한 메모리를 할당하고 각 문자열을 반복하고'char * '를 할당 할 수 있습니다. 그러나 나는 피하려고 노력하고있는 반복과 할당입니다. –

+0

오, 그래서 당신은 미리 문자열의 수를 알고 있습니다 (즉, 할당 전에). 그런 다음 당신이 말한 것처럼 'char **'를 만들고 반복하십시오. – houbysoft

+0

@houbysoft "사전에"나는 컴파일 시점을 의미했습니다. 그에 따라 질문을 업데이트했습니다. –

답변

2
char (*strings)[MAX_STRING_LENGTH] = malloc(sizeof *strings * num_strings); 

는 연속 된 덩어리로 charnum_strings X MAX_STRING_LENGTH 배열을 할당합니다.

strcpy(strings[i], "This is a test"); 
printf("%s\n", strings[j]); 

등. 완료되면 free(strings); 만 입력하면됩니다.

이 방법의 주된 단점은 num_strings이 매우 큰 경우 요청을 충족 할 수있는 충분한 메모리가 없을 수 있으며 대부분의 문자열이 MAX_STRING_LENGTH보다 짧으면 내부 조각화가 발생한다는 것입니다.

+0

니스. 이것은 내 의도와 가장 가깝습니다. 당신이 언급 한 두 가지 단점은 내가 원래의 시도에서 가지고 있었던 문제였습니다. 그것이 효과가 있었기 때문에 내가 살 수있는 결점이있었습니다. 감사! –

1
char **strings; 

strings=(char **) malloc(number of strings); 

strings[i]=(char *) malloc(MAX_STRING_LENGTH); 
+0

1) 첫 번째 호출은 포인터 유형의 크기를 무시합니다. 2) malloc()에서 반환 값을 캐스팅하지 않아야합니다 (http://stackoverflow.com/a/605858/28169 참조). – unwind

+0

나는 void가 자동으로 변환된다는 것을 알고 있더라도 malloc을 항상 캐스트하는 데 사용됩니다. 그러나 stdlib를 포함하는 것을 잊어 버리면 프로그램이 중단 될 수 있다는 흥미로운 설명을 볼 수 있습니다. 왜 누군가가 설명 할 수 있습니까? – alinsoar

1

, 다음은 다음과 같이해야 할 수도 있습니다 할당 된 버퍼의 계산 된 위치에 대한 배열의 개별 포인터 그렇다고해서 이익을 초과 할 수없는 복잡성이 추가됩니다. 이 선언으로

+0

그것이 내가 두려워했던 이유입니다 ... –

2

:

char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings); 

당신이 수를 C 문자열의 배열을 정의하는 것처럼 읽기 -이 아닌 개별 문자열 길이 - MAX_STRING_LENGTH입니다.

더 나은

지금처럼 **char 정의 :

나중에 예컨대하는 문자열을 추가 할 준비가 코드에
char **strings = malloc(sizeof(char *) * numstrings); 

슬롯 5 :

strings[5] = malloc(sizeof(char) * MAX_STRING_LENGTH)); 

또는 같은 초기화 루프에서

:

for (i = 0; i < numstrings; i++) 
    strings[i] = malloc(sizeof(char) * MAX_STRING_LENGTH); 

그리고, 어떤 점에서 더 많은 문자열을위한 공간을 필요로하는 경우, 초기 메모리 할당을 성장 realloc를 사용합니다. 당신이 할당의 여러 수준을 할 필요가 없도록

+0

미리 알지 못하면 다시 시도해야합니다. – AlcoJaguar

+0

@AlcoJaguar 나는 당신을 팔로우 않습니까? "당신이가는대로"? 언제든지'realloc'을 사용하여 _pointer의 버퍼를 char_로 늘릴 수 있습니다. – pb2q

+0

그래, 나도 동의한다. hehe – AlcoJaguar

관련 문제