Я сталкиваюсь с проблемой памяти всякий раз, когда пытаюсь разбить строку - PullRequest
0 голосов
/ 19 июня 2020

Пишу ядро ​​в 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;
}
...