原谅我,如果它太基本,但我得到崩溃,似乎我真的不明白的事情.
我有一个全局变量:
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生活只在功能内部.
我试图理解为什么这是错的,你应该怎么做呢.谢谢.
你不想做什么,因为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)