Пишу ядро в c. Я пытаюсь написать функцию разделения строки, которая принимает строку (char s []), разделитель (char d) и указатель на двумерный выходной массив (char ** outp), который возвращает длину записанных элементов перехитрить. Для справки, я завершил все строки символом '\ n'. Проблема возникает, когда я пытаюсь прочитать из outp после вызова split, он возвращает неожиданные значения. Однако, когда я прочитал outp внутри функции split, значение массива разделенных строк верное.
В демонстрационных целях я собираюсь разделить «Быстрая коричневая лиса прыгает через ленивую собаку» пробелом.
РЕДАКТИРОВАТЬ: Я попытался выделить для него память.
Вот результат изнутри функции разделения
The
quick
brown
fox
jumped
over
the
lazy
dog
Вот результат печати outp после вызова split.
9
lazy
the
the
quick
the
the
brown
the
Изменить: вот функция распределения памяти
u32 free_mem_addr = 0x10000;
u32 kmalloc(u32 size, int align, u32 *phys_addr) {
/* Pages are aligned to 4K, or 0x1000 */
if (align == 1 && (free_mem_addr & 0xFFFFF000)) {
free_mem_addr &= 0xFFFFF000;
free_mem_addr += 0x1000;
}
/* Save also the physical address */
if (phys_addr) *phys_addr = free_mem_addr;
u32 ret = free_mem_addr;
free_mem_addr += size; /* Remember to increment the pointer */
return ret;
}
Edit: Here's where I allocated the memory
```c
output = (char**)kmalloc(MAX_ARG_COUNT * MAX_ARG_SIZE, 1, (u32*)&output);
Here's the input handler in the kernel.
```c
void handle_input(char* input)
{
char** output;
int arg_len = split(input, ' ', output);
kprint("\n");
char str[5];
int_to_ascii(arg_len, str);
kprint(str);
int i;
for (i = 0; i < arg_len; i++)
{
kprint(output[i])
}
kprint("\n$> ");
}
Вот функция разделения строки
int split(char s[], char d, char** outp)
{
int i;
int size = 0;
int buffer_size = 0;
for (i = 0; i < strlen(s); i++)
{
if (s[i] == d)
{
outp[size][buffer_size] = '\0';
kprint(outp[size]);
kprint("\n");
size++;
buffer_size = 0;
}
else
{
outp[size][buffer_size] = s[i];
buffer_size++;
}
}
kprint(outp[size]);
return size+1;
}