изменение указателя на возвращаемую переменную функцию - PullRequest
0 голосов
/ 31 марта 2011

Я пытаюсь передать некоторые переменные параметры через указатель, но я не совсем понял. Парсер не работает, но это не моя проблема. Я использую подмножество C, но не беспокойтесь о синтаксисе или лексике.

Предполагается использовать как:

void functionX(void){
  action[100]="GO_PLAY(12345,23)";
  char id[10];
  char offset[10];
  ParseCommand("GO_PLAY",action,2,&id,&offset);
  // after this id should be "12345" and offset should be "23"
}

bool ParseCommand(char *command, char * buffer,int count, ...){
  bool returnvalue=FALSE;
  int command_len=O_strlen(command);
  int buffer_len=O_strlen(buffer);
  int j=command_len+1;
  va_list ap;
  int parameter=0;
  char *parsed_text;
  va_start(ap, count);         /* Initialize the argument list. */
  while(parameter<count) {
    while(buffer[j]!=','&& buffer[j]!=')') //search argument
      j++;
    if(j<buffer_len) { // argument found
      calloc(MODULE,parsed_text,j-(command_len+1),sizeof(char));
      substr(command_len+1,j,buffer,parsed_text,buffer_len);
      *va_arg(ap,char*)=parsed_text; // why isnt this working?
      parameter++;
      j++; // to continue to search
    }
  }
  leave:
  va_end (ap);
  return returnvalue;
}

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

вместо *va_arg(ap,char*)=parsed_text,

попробуй: sprintf(va_arg(ap, char*), "%s", parsed_text);

0 голосов
/ 31 марта 2011

va_arg(ap,char*) возвращает значение типа char*.То есть это указатель на char.Но вы пытаетесь сохранить значение char* в том месте, на которое оно указывает.Я думаю, что вы действительно хотите скопировать символы, которые вы извлекли из команды, с strcpy или memcpy или чем-то в этом роде.

Кстати, если вы сделаете это, то ваш парсер - простонапример, функции scanf, если они используются неосторожно - будут уязвимы для переполнения буфера, если его попросят проанализировать что-то, содержащее аргументы, которые слишком длинны для переменной, в которой они хранятся. Но это отдельная проблема, и она может или можетне будет серьезной проблемой в зависимости от остальной части вашего кода.

(Возможно, вместо этого вы намеревались скопировать (указатель) значение parsed_text вместо копирования символов. Но тогда у вас есть другая проблема: id и offset не являются переменными указателя, поэтому вы не могли бы сделать это, даже если бы захотели.)

Другие проблемы:

Я не вижу выделенной памяти дляparsed_text, но трудно понять, не видя определения substr.Это функция или макрос?Что именно он должен делать?На самом деле, если substr выделяет память, у вас есть другая проблема, потому что ничто не освобождает ее снова.

Если ваша команда ввода имеет неправильный синтаксис, ваш цикл while может завершиться с концастрока, которая зацикливается до тех пор, пока она не попытается получить доступ к памяти, которой ей не разрешеноЭто произойдет, например, если вы позвоните ParseCommand("GO_PLAY","GO_PLAY(broken",2,&id,&offset).

...