【发布时间】:2016-05-30 11:04:53
【问题描述】:
我有一个像这样的身体的函数 A
char* A (const char* arg) {
char ret[8192];
B(ret);
return strdup(ret);
}
函数 B 看起来像这样(为简洁起见,一些迭代逻辑上的伪代码)
void B(char* ret) {
char retString[8192];
while(ITERATIONS_LEFT) {
snprintf(returnString, 8192, "\n Format %s\n\n", IT_VALUE);
snprintf(returnString, 8192, "\n Val %s\n\n", IT_VALUE_2);
}
strcpy(ret, returnString);
}
所以本质上我有一个函数 A,它为另一个函数 B 提供一个字符串缓冲区,供 B 输入格式化数据。现在,只要从迭代返回的总数据不超过 8196(只是对“足够大”值的猜测),它就可以正常工作,但我认为如果我可以动态地执行此操作而不必担心会更好我的缓冲区填满的情况。在函数 A 仍然必须调用函数 B 并且 B 的签名可以更改但 A 不能更改的约束下,我如何以相当有效的方式实现这一点?
【问题讨论】:
-
与您当前的问题无关,但您正在释放
A函数分配的内存? -
要使用动态内存 (
malloc),您需要事先知道大小(使用strlen("LITERALS") + strlen(values) + 1计算) -
更多与您的问题相关,来自this
snprintf(and family) reference:“调用带有零 bufsz 和缓冲区空指针的 snprintf 对于确定包含输出所需的缓冲区大小很有用”,示例如下。 -
是的,A 中的内存已被释放。我想关键问题是在迭代完成之前我不会知道结果字符串的大小,但是在执行迭代时我希望抓取数据并适当地格式化它(所以我不会有一个缓冲区合适的大小来处理我的迭代代码,直到我完成迭代),所以问题是我将这些数据放在哪里?我总是可以迭代两次,但出于明显的原因我想避免这种情况