Вызов функции для возврата строки внутри другого вызова функции в c - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я работаю над программой с правлением Данте Бруклина II от Audinate. Я пытаюсь использовать функцию возврата void из Dante API - foo () - для которой необходимо передать 3 различные структуры и 2 строки. У меня есть другая функция get_value_by_key (), которая возвращает нужное мне строковое значение. Сначала я попытался вызвать программу так:

    foo(struct, struct, struct, get_value_by_key(key1), get_value_by_key(key2);

Когда я запускаю его таким образом, программа крутит возвращенные строки get_value_by_key () и вылетает из программы целиком. Однако я нашел альтернативу, которая работает, но она длиннее, и я хотел бы не тратить лишнюю вычислительную мощность. Альтернатива здесь:

    char value1[15], value2[15];
    strcpy(value1, get_value_by_key(key1));
    strcpy(value2, get_value_by_key(key2));
    foo(struct, struct, struct, value1, value2);

Кажется, я не могу понять, почему Бруклинская доска закрывается с первой командой, а не со второй. Любая помощь будет высоко ценится. Это код для get_value_key (). Довольно простая логика здесь:

    char * get_value_by_key(command_t command, char key[50]){
         int i;
         char value[50];
         for(i = 0; i < NUM_PARAMETERS; i++){
             if(strcmp(user_command.command_parameter[i].key, key) == 0){
                 strcpy(value, user_command.command_parameter[i].value);
             }
         }
         return value;
     }

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Ваша функция get_value_by_key не работает - она ​​возвращает указатель на локальную переменную (value), которая уничтожается при возврате функции. Таким образом, вы получаете неопределенное поведение при попытке прочитать строку - она ​​все еще может быть там, но может быть перезаписана чем-то другим.

0 голосов
/ 07 сентября 2018

Это выглядит как ошибка:

char * value1, value2; /* value1 is a char*, value2 is a char */
strcpy(value1, get_value_by_key(key1));
strcpy(value2, get_value_by_key(key2));

Вы копируете данные в value1 и value2, но у вас нет выделенной памяти для строк - только указатель и символ. ПРИМЕЧАНИЕ: только value1 является char*, а value2 является одним char. Если вы хотите объявить оба char*, вам нужно написать:

char *value1, *value2;

Приведенный ниже код должен работать без сбоев (при условии, что get_value_by_key () возвращает char*), но я не знаю, как вы хотите выделить место. В стеке, куче или в статической оперативной памяти?

char value1[128], value2[128];
strcpy(value1, get_value_by_key(key1));
strcpy(value2, get_value_by_key(key2));

EDIT: (отредактировано после новой информации в комментариях)

Пожалуйста, отправьте код для get_value_by_key.

Бьюсь об заклад, он использует статический буфер для хранения строки / char-массива, на который он возвращает указатель. Это будет означать, что содержимое будет уничтожено после второго вызова, и это может стать проблемой.

EDIT2:

Если это действительно реальный источник, то вы возвращаете указатель на что-то, выделенное в стеке - строго вербено !!

См. возврат локальной переменной из функции в C

...