2015-10-09 56 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