C 传递数组或指针

C 传递数组或指针,c,arrays,pointers,C,Arrays,Pointers,你好, 函数GetCallRef(…)需要一个指向第三个参数缓冲区的指针,即call_id是我的指针。但是,我不知道将在call\u id中返回的字符串长度。此call\u id将仅用于此函数,因此将仅具有本地作用域,因此我将仅使用函数中返回的call\u id char call_id[1024] 所以我的问题是,;可以声明一个指针并传递它吗 gcc 4.7.2 c89 或者最好声明一个非常大的数组(因为我不知道“大”是否足够大) 实际功能 char call_id[1024] 我没有实

你好,

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

char call_id[1024]
所以我的问题是,;可以声明一个指针并传递它吗

gcc 4.7.2
c89
或者最好声明一个非常大的数组(因为我不知道“大”是否足够大)

实际功能

char call_id[1024]
我没有实际函数
GetCallRef(…)
的源代码,因为它已关闭

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


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

if(GetCallRef(crn, GET_CALLID, call_id) == 0) {
    /* use the call id - not used outside of this function */
}
所有的文档都说缓冲区应该足够大以存储呼叫id,但没有说应该有多大

非常感谢您的建议,

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

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

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


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

在这种情况下,您肯定应该通过一个数组。如果文档说函数需要一个缓冲区,那么仅仅传递一个指针就可能导致segfault。如果它没有给出“足够大”有多大的任何指示,那么这就是糟糕的文档。如果您知道可能是哪种类型的字符串
call\u id
,那么您可以猜测要创建的合适大小的缓冲区。如果没有,您是否能够测试该函数并查看它返回的值的类型?这可能会给我们提供足够的工作思路


尝试使用一个具有足够空间的数组(如您所建议的1024大小似乎是一个很好的起点),然后查看它作为
调用id返回的内容。这样做很多次。例如,您可能会发现它总是一个64个字符的字符串,在这种情况下,您只需向它传递一个至少包含64个元素的数组就可以了。

文档中没有说明调用id的最大大小是多少吗?没有,它只是说缓冲区应该足够大。这有多可悲?在C语言中不能“传递数组”——函数不能有数组类型的参数。此外,如果传递未初始化或空指针,那么它将完全没有意义。C总是按值传递。传递一个不能使用的值有什么意义?“如果我传递一个指针,它可以指定存储字符串值的地址,也就是说,并返回该地址。”什么?那没有任何意义。它可以分配给它或做它想做的任何事情。这是一个局部变量。但它对外部代码没有影响。它可以返回,但您没有使用返回值。您不能在C中“传递数组”——函数不能具有数组类型的参数。请确保可以。我可以将函数定义为
intfoo(charbar[]){…}
很好,向它传递一个普通的指针实际上不会起作用。引擎盖下的机制仍将使用指针,但函数确实可以具有数组类型的参数。更重要的是,这个答案的意思是,OP传递给函数的指针末尾应该有一个实际数组。好的,我刚刚检查了一下,关于传递一个正常指针不起作用的部分是不正确的。但要点仍然正确,更重要的是,我可以轻松地“传递数组”:
inta[3]={…};傅(甲),foo
需要一个
int
指针,那么code>就可以正常工作。对,但这是因为数组被隐式转换为指向其第一个元素的指针,因为函数使用指针。关键是,不管怎样,他调用的函数都会接受一个指针。唯一的问题是指针指向什么。
call_id = call_reference_id;