gcc 4.7.2
c89
您好,
函数GetCallRef(...)期望指向第3个参数的缓冲区指针,即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,但它没有说它应该有多大。
非常感谢任何建议,
答案 0 :(得分:2)
如果文档说“buffer应该足够大以存储调用id”,则意味着该函数希望调用者在堆栈或堆上传递预先分配的缓冲区。 / p>
重要的Q是应该为传递的缓冲区分配多少内存?
该功能的文件应该提到这一点!
没有告诉你这个信息的功能,就没有办法100%安全
也许您需要检查一些其他带有类似参数的api或检查记录此功能规范的功能。
如果一切都失败,你的最后一个选择是分配一个足够大的数组,可能是1024
并严格测试代码。
答案 1 :(得分:0)
在这种情况下你绝对应该传递一个数组。如果文档说该函数想要一个缓冲区,那么只是传递一个指针可能会导致段错误。如果它没有给出任何大“足够大”的指示,那么这就是糟糕的文档。如果您知道可能是哪种字符串call_id
,那么您可以猜测要创建的合适大小的缓冲区。如果没有,您是否能够测试该函数并查看它返回的值是什么类型?这可能会给你足够的想法。
尝试使用具有足够空间的数组(大小为1024,就像你建议的那样似乎是一个很好的起点),并看看它返回的是call_id
。做了很多次。您可能会发现它总是一个64个字符的字符串,例如,在这种情况下,您可以只传递一个至少包含64个元素的数组,并且应该没问题。