2009-06-21 7 views
0

하나의 차원에서만 동적 인 char의 다차원 배열이 필요합니다 ...
가변 길이의 문자가 각각 10 개 이하의 문자열을 저장해야합니다. 의 "쌍".동적 다차원 배열

내 생각은 나에게 문자의 2 × 배열에 대한 포인터를 제공이

char (*instrucao)[2][10]; 

했다,하지만 난 이런 걸 할 때이 제대로 작동하지 않습니다 :

char strInstrucoes[117], *conjunto = calloc(21, sizeof(char)); 
instrucao = calloc(1, sizeof(char[2][10])); 
conjunto = strtok(strInstrucoes,"() "); 
for(i = 0; conjunto != NULL; i++){ 
    realloc(instrucao, i+1*sizeof(char[2][10])); 
    sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]); 
    printf("%s | %s\n", instrucao[i][0], instrucao[i][1]); 
    conjunto = strtok(NULL, "() "); 
} 

같이 strInstrucoes을 갖는 (abc,123) (def,456) (ghi,789), 나는 이처럼 2 쌍의 3 줄로 각각 행렬을 만들지 않습니다 :

abc | 123 
def | 456 
ghi | 789 
abc | 123 
def | 45def | 45de 
ghi | 789 

이 작업을 수행하는 올바른 방법은 무엇입니까 : 414,하지만 대신 내가지고있어 무엇인가? 감사합니다.

답변

5

당신은 포인터를 오류 검사에 대한 새 포인터에 할당하고 NULL를 확인하기를 원할 수 있다는

instrucao = realloc(instrucao, (i+1)*sizeof(char[2][10])); 

주를 반환 realloc 새 주소를 할당해야합니다. 또한 괄호에 유의하십시오. 기본적으로 필요한 크기를 곱하는 대신 i을 추가했습니다. 쉽게 감독.

초기 calloc은 필요하지 않습니다. instrucaoNULL으로 초기화하면 realloc은 처음 null 포인터를 전달할 때 malloc처럼 동작합니다.

+0

절대적으로 맞다 ... 내 오래된 코드를 살펴보면, 실제로 포인터를 realloc에 ​​할당 한 적이 없다는 것을 알았다. C와는 전문적으로 잘 작동하지 않아요. 고마워 대단히 – Gabe

+0

Realloc은 사용자가 지정한 동일한 주소를 반환 할 수 있도록 설계되었으므로 다시 할당 할 필요가 없지만 액세스 할 수있는 영역을 확대하면됩니다. 그러나 때로는 실제 재 할당도 발생합니다. 또한 읽은 문자를 제한해야합니다. sscanf (conjunto, "% 9 [^,], % 9s", ...); 그렇지 않으면 악의적 인 친구들이 버퍼 오버 플로우를 일으킬 수 있습니다. –

+0

@litb 그래,하지만이 경우에는 입력 데이터를 절대적으로 제어 할 수 있기 때문에 걱정하지 않았다. – Gabe

0

귀하의 필요에 맞는 컨테이너가있는 라이브러리를 찾는 것이 훨씬 낫습니다. 최악의 경우 훨씬 더 나은 라이브러리를 사용하지 않고 두 개의 개별 배열을 가질 수 있으며 각 배열은 쌍의 절반을 차지합니다.