如果它太基础,请原谅我,但我会崩溃,而且我似乎不太了解。
我有一个全局变量:
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/