我正在创建一个函数,其中读取串行并将其匹配到某个值,如果它匹配,那么我将string1
存储在变量x
中,否则我尝试将读取序列与第二个字符串,如果它匹配,那么我将string2
存储在x
中,依此类推。现在我希望这个函数将这个字符串(存储在变量x中)返回到调用它的主函数。
答案 0 :(得分:8)
您有几个选择。您可以让调用者提供将用于存储返回值的缓冲区:
void foo0(char * buf, int maxBufferSize) {
while(maxBufferSize && *buf = getByteFromSerial()) { //assumes getByte returns 0 for done
maxBufferSize--;
}
} // If you really feel like it, you can alter this to return the original buf
您可以让方法本身维护一个缓冲区,用于返回值:
char * foo1() {
static char buf[BUF_SIZE+1];
int copiedBytes = 0;
while (copiedBytes<BUF_SIZE && buf[copiedBytes++] = getByteFromSerial());
buf[copiedBytes] = '\0';
return buf; // Note that when you call foo() again, this will be destroyed.
}
您可以让方法分配缓冲区:
char * foo2() {
static char buf[BUF_SIZE+1];
// do all the stuff from the previous version
char * retval = malloc(copiedBytes);
strcpy(retval, buf);
return retval;
}
这最后一个解决方案存在许多问题。是的,你必须记住解除分配,但更糟糕的是,对内存如此少的东西进行动态内存分配应该会吓到你。有关详细信息,请查找内存碎片。想想看,我从来没有在微处理器上使用malloc正是出于这个原因。当内存太少时,你可能会想出更好的方法来自己动态分配内存。
我的偏好是让调用者提供缓冲区。这样,任何必要的分配和释放都会在堆栈上得到妥善处理,并且您没有多个调用者问题,上面的foo1()会让您感到厌烦。
void someFunction() {
char buf[BUFF_SIZE+1];
fillMyBuffer(buf, BUFF_SIZE);
doSomethingWithMyBuffer(buf);
}
这样,当someFunction返回时,它的缓冲区不再占用内存,我的程序中没有一个函数,它有一个静态缓冲区占用空间,可能只是很少使用。