2015-10-09 92 views
4

原諒我,如果它太基本,但我得到崩潰,似乎我真的不明白的東西。從函數獲取字符指針

我有一個全局變量:

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 

好obvi不僅如此,我不是在做錯事,我真的沒有用指針得到事情。

我知道data's生活只在功能裏面。

我想知道爲什麼這是錯的,你應該怎麼做。 謝謝。

+0

我沒有得到你。如果你知道數據變量作用域是本地的,那麼問題是什麼? – LPs

+0

你真的應該怎麼做? :) – Curnelious

+0

我不知道爲什麼你不會在'char * incomingData =「」;'... – Psytho

回答

5

您正在嘗試執行的操作是不允許的,因爲readWifDataAsSever退出data的時刻將變爲無效。通過任何指向它的指針訪問它都是未定義的行爲。

但是,你的程序甚至沒有這樣做:因爲按值傳遞reqData指針,它的任何任務在調用者沒有影響,即

reqData=data; 

改變什麼的呼叫者你的功能看到。

爲了解決你需要做的問題兩種情況之一:

  • 傳遞一個有效緩衝的功能,其長度沿,或
  • 使內部的動態分配功能,並讓呼叫者釋放結果。

因爲您是使用有限資源的嵌入式系統上工作,第一種方法是在你的情況最合適的:

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循環內的數據,因爲在循環之後,我對數據進行了一些其他操作。請參閱我的編輯。 – Curnelious