2009-06-21 2 views
0

Мне нужен многомерный массив символов, который является динамическим только в одном измерении ...
Мне нужно хранить пару строк длиной 10 (или меньше) символов каждый, но с переменным числом «пар».Динамический многомерный массив

Моя идея была эта

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

Что дает мне указатель на 2x10 массив символов, но это не работает должным образом, когда я делаю что-то вроде этого:

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, "() "); 
} 

Having strInstrucoes, как (abc,123) (def,456) (ghi,789), я не являюсь матрицей с 3 линиями по 2 пары:

abc | 123 
def | 456 
ghi | 789 

, но вместо того, чтобы это то, что я получаю:

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

Что правильный способ сделать это? Спасибо!

ответ

5

Вы должны присвоить указатель на новый адрес realloc возвращает

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

Обратите внимание, что для проверки ошибок, вы можете пожелать назначить новый указатель и проверить NULL. Также обратите внимание на parens - вы в основном просто добавили i вместо того, чтобы умножать требуемый размер. Легко контролируется.

Обратите внимание, что для начального calloc нет необходимости. Просто инициализируйте instrucao до NULL, а realloc будет вести себя как malloc, когда сначала передается пустой указатель.

+0

Абсолютно верно ... И, глядя через старые старые коды, я заметил, что я никогда не назначал указатель на realloc. Хорошо, что я не работаю с C профессионально, тогда! Большое спасибо – Gabe

+0

Realloc разработан так, чтобы он мог возвращать тот же адрес, который вы ему дали, поэтому он не должен перераспределять, а просто увеличивать область, к которой он имеет доступ. Но иногда происходит и реальное перераспределение. Также обратите внимание, что вы, вероятно, должны ограничивать чтение символов. например sscanf (conjunto),% 9 [^,],% 9s ", ...); иначе злые парни могут вызвать переполнение буфера. –

+0

@ litb Да, но в этом случае у меня есть абсолютный контроль над входными данными (я пишу все файлы), поэтому я не беспокоился об этом – Gabe

0

Вы бы гораздо лучше нашли библиотеку с контейнером, которая будет отвечать вашим потребностям. В худшем случае, используя ни одну из значительно более совершенных библиотек, вы можете иметь два отдельных массива, каждый из которых содержит половину пары.

Смежные вопросы