Динамический многомерный массив - PullRequest
0 голосов
/ 22 июня 2009

Мне нужен многомерный массив символов, который является динамическим только в одном измерении ...
Я должен хранить пару строк длиной 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, "() ");
}

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

abc | 123
def | 456
ghi | 789

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

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

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

Ответы [ 2 ]

5 голосов
/ 22 июня 2009

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

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

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

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

0 голосов
/ 22 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...