У меня есть функция, которая принимает void**
аргумент и целое число, которое указывает на его типДать обобщенную функцию в C, как обрабатывать строки
void foo (void** values, int datatype)
Внутри функции, в зависимости от типа данных, я таНос это это путь:
if (datatype == 1)
*values = (int*) malloc (5 * sizeof(int));
else if (datatype == 2)
*values = (float*) malloc (5 * sizeof(float));
Все хорошо до сих пор. Однако, когда персональные строки попадают в картину, все становится сложнее. void**
необходимо будет void***
, так как мне нужно будет сделать что-то вроде этого:
*values = (char**) malloc (5 * sizeof(char*));
for(i=0;i<5;i++)
(*values)[i] = (char*) malloc (10);
..
strncpy((*values)[0], "hello", 5);
Как следует такая ситуация обрабатывается? Могу ли я передать char***
функции, ожидающей void**
, но ввергните ее в нее?
void foo (void** values, int datatype) {
if(datatype == 3) {
char*** tmp_vals = (char***) values;
*tmp_vals = (char**) malloc (5 * sizeof(char*));
...
(*tmp_vals)[i] = (char*) malloc (10 * sizeof(char));
strncpy ( (*tmp_vals)[i], "hello", 5);
}
Так что я просто бросил void**
в char***
. Я пробовал это и игнорировал предупреждения, он работал нормально. Но разве это безопасно? Есть ли более изящная альтернатива?
Где хранится содержимое струн? Простое выделение массива указателей не создает пространства для символов. Строки динамические и распределены в одном и том же месте, или статические, или произвольные миксы? –
Эта же функция копирует данные во вновь созданный массив строк – jitihsk
Но вы не создаете массив строк ... – zubergu