Разбор строки TFTP-пакета в C с использованием указателей

Я получаю пакеты TFTP (запросы на чтение), используя recvfrom с буфером 512 байт.

Строка (имя файла для передачи) начинается с третьего байта буфера. Первые два зарезервированы для кода операции.

Я написал следующую функцию:

char * parseFileName(char * buffer){
    char * filename;

    for(int i = 0; buffer[i] != '\0'; i++)
        *(filename + i) = buffer[i];

    *(filename + i) = '\0';

    return filename;
}

и я называю это с учетом смещения кода операции:

char * filename = parseFileName(buffer + 2);

Однако это не работает, и программа останавливается:

printf("%s", filename);

Если я не добавлю это:

printf("\n");

прямо перед оператором return в функции parseFileName. Только тогда я могу напечатать строку имени файла в вызывающей функции.

Почему это происходит?


person paranoidhominid    schedule 18.09.2015    source источник
comment
Вы не выделили места для filename, на которое он мог бы указывать.   -  person Barmar    schedule 19.09.2015
comment
Кстати, ваш цикл можно заменить на strcpy(filename, buffer).   -  person Barmar    schedule 19.09.2015


Ответы (1)


Поскольку вы не выделяете память для char* filename.

Если вы знаете, что строка начинается с буфера + 2 и имеет ограничитель \0, вы можете сделать это напрямую:

char* parseFileName(char* buffer) {
  return strdup(buffer);
}

char* fileName = parseFilename(buffer+2);

Имейте в виду, что для этого требуется free, когда вы закончите с именем файла.

person Jack    schedule 18.09.2015