Непонятное поведение printf() - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток всем. Недавно начал изучать си и возникло непонимание происходящего в программе. Пишу cgi скрипт. Подключил библиотеку cgi-bin, скомпилировал все это дело, используя свою программу и статическую библиотеку, созданную через make. Вот одна из функций библиотеки: char *find_val(LIST *head, char *key); Функция, исходя из написанного, возвращает УКАЗАТЕЛЬ на область памяти, в которую записана строка. Соответственно, я в своем коде пишу:
    LIST *input = cgi_input_parse();
    char *key = "test";
    char *str = find_val(input, key);
    printf("the value of the param \"test\" is the %s", str);
При обращении к cgi-скрипту POST-запросом из PHP (библиотека curl) я подаю строку test=xxx (неважно, что там) Но когда я обращаюсь к такой программе, написанной выше, я ожидаю увидеть АДРЕС ячейки памяти, а не значение XXX, потому что я создал переменную-указатель на строку. По сути, чтобы вывести значение, я должен написать:
printf("the value of the param \"test\" is the %s", *str);
Таким образом я произвошу развертку (не помню, как называется) и по указателю получаю значение, записанное в ячейку памяти. По факту я получаю ошибку при компиляции, мол, неверный тип, ожидается строка а подан аргумент типа int. Тогда я меняю %s на %d, запускаю прогу и вижу "the value of the param "test" is the 72". Это даже не значение переменной, да и не адрес ячейки памяти. Это вообще чертовщина какая-то. Причем возвращается одно и то же значение (значит, это не мусор). Т.к. си я изучаю первый день, я явно ошибаюсь. Но где? Поясните, пожалуйста. Мануалы читал, считал, что все понимаю, но этот пример сбил с толку.

Решение задачи: «Непонятное поведение printf()»

textual
Листинг программы
    char s[5] = "test";
    char *keyref = s;
    printf("%s\n", keyref);

Объяснение кода листинга программы

  1. Объявляется массив символов s[5] и инициализируется строкой test
  2. Создается указатель keyref на первый элемент массива s
  3. Выводится значение указателя keyref с помощью функции printf() Обратите внимание, что в данном коде не происходит вывода значения переменной s. Выводится только адрес, на который указывает указатель keyref.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5