我可以创建一个函数,它接受一个指向数组的指针,该数组在每次调用时可能包含不同类型的数字吗?

标签 c function pointers

我需要编写一个函数,将“n”个元素的数组写入二进制输出文件。我想避免为我可能希望写入的每种数据类型(int、float、double 等)编写单独的函数。

有什么方法可以将数据类型(可能是字节数)指定为函数的参数,并让函数确定它如何处理它?

例如

f_writebinary(??? *data, int size, long n) {

   for(i=0;i<n;i++) {

        fwrite((data+i),size,1,stdout); 

    }
}

...或者这是对 C 的完全荒谬的期望?

最佳答案

是的,这正是 fwrite() 的作用。它使用 const void * 表示“指向任何类型数据的指针”,并将其视为指向字节的指针。

因此,您的包装器并不是真正需要的,您可以立即对 fwrite() 进行正确大小的调用以写入数组:

const int my_ints[3] = { 1, 2, 3 };
const double my_doubles[5] = { 5, 4, 3, 2, 1 };

fwrite(my_ints, sizeof *my_ints, sizeof my_ints / sizeof *my_ints, stdout);
fwrite(my_doubles, sizeof *my_doubles, sizeof my_doubles / sizeof *my_doubles, stdout);

请注意,将二进制数据写入 stdout 可能有些粗鲁,而且应该检查 I/O 调用是否有错误。

如果您放弃 fwrite() 的 API 使用的“x 个元素的 y 个字节”模型,并将它们视为单个字节 block ,您可以简化调用:

fwrite(my_ints, sizeof my_ints, 1, stdout);
fwrite(my_doubles, sizeof my_doubles, 1, stdout);

请注意,循环没有意义,每个数组中的数字在内存中都是相邻的,因此 fwrite() 可以一次写入它们。通常最好尽可能地减少 I/O 调用的数量,因此如果您可以单次写入 n * m 字节而不是 n 写入每个 m 字节,这通常会更好。请记住,您写入的许多底层设备都是面向 block 的,并且会从获取整个数据 block 中获益良多,因为无论如何这是它们必须写入的内容。

关于我可以创建一个函数,它接受一个指向数组的指针,该数组在每次调用时可能包含不同类型的数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16981619/

相关文章:

c - 数组中的数组

c - 使用 C 中的 getopt_long 解析终端中的选项参数

javascript - 点击 jQuery 不工作 FireFox - 可能是 event.preventdefault

php - 从 mysql 转换为 mysqli

c++ - "inline function need to be DEFINED in all tranlation units"背后的基本原理是什么?

函数错误类型冲突

c++ - C++中指针初始化

c - 无法接收使用 NETLINK_ROUTE channel 从内核模块发送到用户应用程序的自定义消息

c - 使用 strlen 和完整数组不打印的数组长度不同?

c - 是否可以成功链接到具有不同导出 API 但具有相同对象名称的静态 linux 库?