0
gcc 4.7.2
c89

你好,

函数 GetCallRef(...) 需要一个指向此第三个参数的缓冲区的指针,即 call_id 是我的指针。但是,我不知道将在 call_id 中返回的字符串的长度。此 call_id 将仅在此函数中使用,因此将仅具有本地范围,因此我将仅使用函数中返回的 call_id。

所以我的问题是;可以声明一个指针并传递它吗?

char *call_id = NULL;

或者最好声明一个非常大的数组(因为我不知道大就足够大)

char call_id[1024]

实际功能。

if(GetCallRef(crn, GET_CALLID, call_id) == 0) {
    /* use the call id - not used outside of this function */
}

我没有实际功能的源代码,GetCallRef(...)因为它已关闭。

我猜缓冲区会更好,因为内部函数可以直接复制到该缓冲区中。但是,由于数组衰减为函数参数中的指针,并且我没有传递大小,因为它不是这个函数签名的一部分,它的长度只有 4 个字节。该函数如何知道我的数组有多大?这不可以。

如果我传递一个指针,它可以分配存储字符串值的地址,即并返回它。

call_id = call_reference_id;

所有文件都说缓冲区应该足够大以存储呼叫ID,但没有说明它应该有多大。

非常感谢您的任何建议,

4

2 回答 2

2

如果文档说“缓冲区应该足够大以存储调用 ID”,则意味着该函数希望调用者传递一个预先分配的缓冲区,无论是在堆栈上还是在堆上。

重要的问题是应该为传递的缓冲区分配多少内存?

该函数的文档应该提到这一点!
如果没有函数告诉您这些信息,就不可能 100% 安全。
也许您需要检查其他一些采用类似参数的 api 或检查记录此参数的功能规范。

如果一切都失败了,你最后的选择是分配一个足够大的数组,也许1024并严格测试代码。

于 2013-01-16T05:15:58.790 回答
0

在这种情况下,您绝对应该传递一个数组。如果文档说该函数需要一个缓冲区,那么仅传递一个指针可能会导致段错误。如果它没有给出“足够大”有多大的任何迹象,那么这就是糟糕的文档。如果您知道可能是哪种字符串call_id,则可以猜测要创建的合适大小的缓冲区。如果没有,您是否能够测试该函数并查看它返回的值是什么类型的?这可能会提供足够的想法来工作。

尝试使用一个有足够空间的数组(你建议的大小为 1024 似乎是一个很好的起点),并查看它作为call_id. 多次这样做。例如,您可能会发现它始终是一个 64 个字符的字符串,在这种情况下,您可以将一个至少包含 64 个元素的数组传递给它,应该没问题。

于 2013-01-16T05:16:15.603 回答