c - 如何就地修改项目(不复制/传递缓冲区)
问题描述
我经常看到 C 中的函数类似于以下内容:
do_something(buffer, original_data)
在这种情况下,它获取原始数据(通常const
)并将用户请求的数据返回到缓冲区中。例如,类似gets
or的函数readline
。
如果程序存在特定的内存限制并且没有空间来返回原始数据和请求的数据怎么办。例如,如果有 1GB 的文本数据需要排序,而用户没有 2GB 可用怎么办。可以通过就地修改数据来运行的函数(例如排序函数)的示例是什么?
解决方案
标准库函数qsort
。
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
传入要排序的数组,传入base
长度,传入nmemb
每个元素的大小,传入size
比较函数compar
。
调用看起来像这样:
char **strings = NULL;
size_t nstrings = 0;
// do something to load strings;
//...
// sort the strings
qsort(strings, nstrings, sizeof(char *), string_comparer);
int string_comparer(const void *a, const void *b) { return strcmp(*(const char *)a, *const char *b); }
由于缺少传递给函数的指挥棒,这个 API 感觉有点陈旧和笨重,但随着gcc
扩展允许内部函数访问外部函数中的变量,这不再是一个真正的问题。
某人的 glibc 镜像在qsort
这里:https ://code.woboq.org/userspace/glibc/stdlib/qsort.c.html内核版本在这里:https ://github.com/torvalds/linux/blob/8a72f3820c4d14b27ad5336aed00063a7a7f1bef /lib/sort.c
推荐阅读
- web-api-testing - 测试 Google 安全浏览 API 的返回
- sorting - Solr 结果根据字段优先级
- javascript - 如何使我的 Firestore 搜索可重复?
- android - 代号一:隐藏标题(区域)但不隐藏状态栏空间(iOS & Android)
- python - 遍历字典中的键
- python - 本地机器无法访问 Docker 容器(Django 服务器)
- amazon-web-services - 每次在我的 AWS SQS 目标上推送通知时如何触发事件?
- python - 格式为 yy/mm/dd 的日期时间
- php - 使用 Mpdf 在第一页添加索引
- nestjs - websocket中的范围请求