изменить строку:
char* p[5] = {(char*)malloc(50)};
до
char *p[5];
int i=0, n=5;
/* Allocate */
for (i=0; i<n; i++)
{
p[i] = malloc (sizeof (char) * 50);
}
/* Do work */
/* Deallocate */
for (i=0; i<n; i++)
{
free (p[i]);
}
EDIT1:
похоже, что вы хотели добиться назначения по умолчанию остальных мест, как мы можем сделать с
char arr[10] = {0};
Но в вашем случае у вас есть
char *p[5];
и для каждого местоположения p
вам нужна отдельная ячейка памяти, которая должна быть индивидуально назначена / выделена и освобождена / освобождена от вышеуказанного.
EDIT2:
В вашей функции разделения вы делаете ужасные вещи. Если вы выделили память для p
в основном, а затем передали ее в функцию split
, то почему вы назначаете указатель снова на элементы массива p
. Каждый элемент p
указывает на весь массив (блок памяти), который можно использовать для хранения строки. Таким образом, вы должны скопировать часть строки в p[i]
для некоторого индекса i
, с strcpy
.
Кроме того, почему вы возвращаете массив? Вы передали его в качестве указателя, и все изменения, внесенные в него в функции, сохранятся после возврата.
EDIT3:
Вот модифицированное разбиение, выполненное с применением минимальных модификаций к вашему коду.
void split( char *result[], char *w, const char *delim)
{
int i=0;
char *p;
for(i=0, p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim), i++ )
{
strcpy (result[i], p);
}
}
Вот основная функция теста:
int main (void)
{
char arr[128] = "10.08.1989";
char *p[5];
int i, n = 5;
for (i=0; i<n; i++)
{
p[i] = malloc (sizeof (char) * 50);
}
split (p, arr, ".");
printf ("%s\n", p[0]);
printf ("%s\n", p[1]);
printf ("%s\n", p[2]);
for (i=0; i<n; i++)
{
free (p[i]);
}
printf ("\n");
return 0;
}