C API:为什么函数使用带有缓冲区+大小的returnParameters而不是返回char *

雅各布

我并没有那么多地使用C,但是当我这样做时,我注意到许多API都在使用带有缓冲区的返回参数,并且返回值是最大大小,而不是返回指向所请求缓冲区的指针。为什么会这样,更重要的是-我是否必须为我仅私下使用的每个功能都这样做?

拿:

int crazy_c_getSomeText(char* buf, int len);

而这:

char* crazy_c_getSomeText();

冗长得多,是不是也一样?

好吧,您没有int第一个函数的返回值,这可能是错误代码。这是唯一的原因还是我要监督一些与内存管理相关的事情?

更新:感谢您的快速回复!我发现还有更多我没有考虑的问题:可访问性和分配的不确定性。但是,如果这些函数不是某些库函数而是某些本地助手,那该怎么办?然后,我可以确保可以访问该内存,并且知道该内存的保存方式。

安祖里奥

是的; 我认为您正在监督一些与内存管理相关的事情。

在我的脑海中-考虑到我使用.NET P / Invoke的经验-我可以说,如果我想尝试使用C API(如后者在C#中的签名),则很可能会使我的应用程序崩溃,即, “字符串”将在.NET应用程序可能无法访问的内存位置中创建;任何访问返回值的尝试都会引起问题。我认为在许多情况下都是如此。

我认为,假定API的客户端可以访问与API本身相同的内存部分不是一个好习惯。

此外,在没有自动回收内存的环境中(如C中的情况),每个实体都应在其自身之后进行“清理”。char* crazy_c_lib_getSomeText();不会有这样的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

为什么在C#7.2的结构中不能同时使用只读缓冲区和固定大小缓冲区

C ++为什么仍然还有输入缓冲区?

从具有char缓冲区的DLL为C函数创建python回调。

将缓冲区(char *)传递给C中的函数

是否可以在C中使用较大的char缓冲区

您将如何限制缓冲区大小并返回c ++中的缓冲区限制?

为什么HDFS使用协议缓冲区而不是Java序列化API进行序列化?

C ++中的缓冲区大小

Microsoft的C库函数的C ++安全版本如何知道静态缓冲区的大小?

为什么分支目标缓冲区会影响函数调用的返回?[WinMIPS64]

C ++在带有右值缓冲区的ostream中使用snprintf,这格式正确吗?

RegQueryValueEx返回ERROR_SUCCESS,但没有获取数据缓冲区。为什么?

c、按函数参数的运行时缓冲区大小

无法使用Google协议缓冲区从C#返回相同的double到C ++,然后返回

标准C库中缓冲区大小的特殊宏是什么?

为什么fs.readFile返回缓冲区?

从 field_buffer 返回的 char* 指向的缓冲区的大小

为什么我得到不同的输出?我正在使用有界缓冲区、pthreads 和信号量使用 C++ 进行编码

为什么默认的char缓冲区大小为BufferedReader 8192?

为什么逐行读取文件时缓冲区大小不是总是4096的整数倍?

使用C ++ API解析协议缓冲区中的错误

c++ 使用 std::copy 将 istream 复制到 char* 缓冲区

为什么Node.js的fs.readFile()返回缓冲区而不是字符串?

缓冲区溢出 c(获取函数)

C ++使用缓冲区写文本在文件末尾返回非ASCII字符。

C:什么是缓冲区下溢?

在C语言中,stdout缓冲区的大小是多少?

更改缓冲区大小以在C中复制文件