У меня есть функция, которая принимает аргумент void**
и целое число, которое указывает его тип данных
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***
. Я пробовал это и игнорировал предупреждения, он работал нормально.
Но разве это безопасно? Есть ли более изящная альтернатива?