Значение указателя не является адресом? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть CGI-скрипт (C program test.elf) , который вызывается методом GET. Это означает, что данные добавляются к URL-адресу, который указывает на тот же сценарий CGI. Например:

http://.../cgi/c/test.elf?m=20&n=2000

Здесь мы отправляем набор данных m=20&n=2000, который отделен от остальной части URL знаком вопроса ?. Отдельные переменные в наборе данных также разделяются &. Так что на самом деле мы отправляем m=20 и n=2000.

Интерфейс CGI автоматически сохраняет отправленный набор данных m=20&n=2000 в переменной среды QUERY_STRING на время вызова, и я хочу, чтобы мой сценарий CGI сначала напечатал его (a) значение и (b) адрес.

Это CGI-скрипт:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){

    // getenv() returns a pointer to character (char*) and we need same type (char*) to store it.
    char* data;

    // We need an "array of characters" which is actualy the same as "string of characters".
    // Because strcpy() can only take pointer to the start of the array we also define another 
    // pointer and point it to array.
    char stored_enviromental_variable[1000];
    char* pointer;
    pointer = &stored_enviromental_variable[0];

    // ASCII HTML header
    printf("content-type:text/html; charset=utf-8\n\n");

    printf("<h1>Multiplication result</h1>");

    // Pointer now points to enviromental variable.
    data = getenv("QUERY_STRING");

    // We store the value of pointer
    strcpy(pointer, data);

    // We print some information.
    printf("%s: %s<br>", "Value of the \"QUERY_STRING\"", stored_enviromental_variable);
    printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);

}

Это компилируется с предупреждением:

[ziga@localhost ~]$ gcc -Wpedantic -std=c18 -Wall -o test.elf test.c 
test.c: In function ‘main’:
test.c:42:15: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘char *’ [-Wformat=]
  printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);
              ~^                                          ~~~~
              %s

Таким образом, похоже, что этот исходный код вызывает проблему:

printf("%s: %x<br>", "Address of the \"QUERY_STRING\"", data);

Что странно для меня, потому что я подумал, что "указатель всегда хранит местоположение" . Итак, почему data хранит символ? Как я могу удалить предупреждение?


Если я вызываю скрипт CGI в браузере, где я получаю это:

enter image description here

1 Ответ

2 голосов
/ 06 февраля 2020

Как говорится в сообщении об ошибке, спецификатор формата %x для printf ожидает аргумент unsigned int, но вместо этого вы передаете data, тип которого char *.

Для печати значение указателя вы должны использовать спецификатор формата %p. Кроме того, аргумент должен быть приведен к void *:

printf("%s: %p<br>", "Address of the \"QUERY_STRING\"", (void *)data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...