从函数获取字符指针

Getting char pointer from function

如果它太基础了,请原谅我,但我会崩溃,而且我似乎不太明白。

我有一个全局变量:

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

很明显,不仅我做错了事,我还没有真正理解指针。

我知道data's生命只在函数里面

我想了解为什么这是错误的,以及您应该如何真正做到这一点。 谢谢。

不允许您尝试执行的操作,因为 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] = '[=11=]';
        return 0;
    }
}