c - 从函数获取字符指针

标签 c arduino

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

我有一个全局变量:

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

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

我知道数据的生​​命只存在于函数中。

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

最佳答案

您尝试执行的操作是不允许的,因为 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;
    }
}

关于c - 从函数获取字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039930/

相关文章:

c - 替换C中字符串中字符的ASCII值

arduino - 如何在 Arduino IDE 中将 4.15V 锂 ionic 电池的电池电压转换为电池百分比? (我正在制作某种 LED 电池指示灯)

django - 从 Arduino 到 Django 数据库的 HTTP POST 数据

C,将文件元素读入数组,错误访问代码

c - Arduino 与 A9 - AT 命令故障排除

python - 将浮点型数据从 Arduino 发送到 Python

javascript - 访问不断变化的变量将不起作用(Johnny-Five 操纵杆)

c - Displayinfo() 函数不起作用,它表示文件未创建。该函数的目的是读取特定行

c - 调用c函数时出现段错误

c - 使用 Glade(和 C)的 GTK+ 中消息对话框的信号处理程序