2015-10-09 3 views
4

Простите меня, если это слишком просто, но я получаю сбои, и кажется, что я действительно не понимаю вещи.Получение указателя char от функции

У меня есть глобальная переменная:

char *incomingData=""; 

тогда я эту функцию, которая получает некоторые данные из некоторых аппаратных:

void readWifDataAsSever(char* reqData) 
{ 
      char data[100]={0}; 
      //... 
      if (len > 0) 
      { 

        for(uint32_t i = 0; i < len; i++) 
         data[i]=(char)buffer[i]; 

       ParseGetRequest(data); //some other manipulation 
        reqData=data; 
      } 
      else 
      reqData=""; 

} 

Тогда я пытаюсь вызвать эту функцию из другого места, дать это глобальная переменная и получить новые данные от функции:

readWifDataAsSever(incomingData); //incoming data is the global i just show 
//check length of incomgin data 

Well obvi ously, не только, что я делаю что-то неправильно, я действительно не получаю вещи с указателями.

Я знаю, что data's жизнь есть только внутри функции.

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

+0

Я не получаю вас. Если вы знаете, что область переменных данных является локальной, в чем вопрос? – LPs

+0

Как вы действительно должны это делать? :) – Curnelious

+0

Интересно, почему вы не получите сообщение об ошибке на 'char * incomingData =" ";' ... – Psytho

ответ

5

То, что вы пытаетесь сделать, не допускается, так как момент, когда readWifDataAsSever выходит из data, становится недействительным. Доступ к нему через любые указатели, которые могут все еще указывать на него, - это неопределенное поведение.

Однако ваша программа даже не делая, что: так как вы передаете reqData указатель на значение, любые задания на него не оказывают никакого влияния на абонента, т.е.

reqData=data; 

делает не изменения, что вызывающий ваша функция видит.

Для того, чтобы исправить эту проблему вам нужно сделать одну из двух вещей:

  • Pass действительного буфера функции, наряду с его длиной, или
  • Сделать динамическое распределение внутри функции, и у вызывающего есть бесплатный результат.

Поскольку вы работаете на встроенной системе с ограниченными ресурсами, первый подход является наиболее подходящим в данной ситуации:

size_t readWifDataAsSever(char* reqData, size_t maxLen) { 
    if (len > 0) { 
     size_t activeLength = len < maxLen ? len : maxLen; 
     for(size_t i = 0 ; i < activeLength ; i++) { 
      reqData[i]=(char)buffer[i]; 
     } 
     return activeLength; 
    } else { 
     reqData[0] = '\0'; 
     return 0; 
    } 
} 
+0

Поскольку это помеченный Arduino, единственное разумное решение - передать действительный буфер. Динамическое распределение никогда не должно использоваться на простой встроенной системе. – Lundin

+0

@ Lundin Вы правы, я не видел тег. Когда ресурсы настолько ограничены, динамическое распределение является первым, которое нужно удалить. Спасибо! – dasblinkenlight

+0

большое спасибо! я не могу загрузить данные внутри цикла for, потому что после цикла for у меня есть некоторые другие манипуляции с данными. см. мое редактирование, пожалуйста. – Curnelious

Смежные вопросы