从函数中获取char指针

4 c arduino

原谅我,如果它太基本,但我得到崩溃,似乎我真的不明白的事情.

我有一个全局变量:

char *incomingData="";
Run Code Online (Sandbox Code Playgroud)

然后我有这个功能,从一些硬件获取一些数据:

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="";

}
Run Code Online (Sandbox Code Playgroud)

然后我试图从另一个地方调用该函数,给它全局变量,并从函数中获取新数据:

readWifDataAsSever(incomingData);  //incoming data is the global i just show
//check length of incomgin data
Run Code Online (Sandbox Code Playgroud)

很明显,不仅仅是我做错了,我还没有用指针搞定.

我知道data's生活只在功能内部.

我试图理解为什么这是错的,你应该怎么做呢.谢谢.

das*_*ght 5

你不想做什么,因为readWifDataAsSever退出的那一刻data变得无效.通过任何可能仍指向它的指针访问它是未定义的行为.

但是,您的程序甚至没有这样做:因为您reqData按值传递指针,所以对它的任何赋值都不会对调用者产生影响,即

reqData=data;
Run Code Online (Sandbox Code Playgroud)

不会改变你的函数的调用者看到的东西.

为了解决问题,您需要执行以下两项操作之一:

  • 将有效缓冲区及其长度或函数传递给函数
  • 在函数内部进行动态分配,让调用者释放结果.

由于您正在使用资源有限的嵌入式系统,因此第一种方法最适合您的情况:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Curnelious正如他们所说,"C将汇编语言的强大功能与汇编语言的灵活性和易用性相结合." (2认同)