C : 在空数组中插入/获取元素

2024-07-03

我必须创建一个可以包含通用数据结构的通用数组。 如何将通用结构放入 void 数组的空槽中?

这是我的代码。

struct CircularBuffer {
    int E;
    int S;
    int length;   // total number of item allowable in the buffer
    int sizeOfType;   // size of each element in the buffer
    void *buffer;
};

struct CircularBuffer* circularBufferInit(int length, int sizeOfType) {

    struct CircularBuffer *cb = malloc(sizeof(struct CircularBuffer));
    cb->E = 0;
    cb->S = 0;
    cb->length = length;
    cb->sizeOfType = sizeOfType;
    cb->buffer = malloc(sizeOfType *length);
    return cb;
}

int circularBufferIsEmpty(struct CircularBuffer* cb) {
    if (cb->S == cb->E)
        return 1; //empty
    else
        return 0;
}

int circularBufferIsFull(struct CircularBuffer *cb) {
    int nE = (cb->E + 1) % (cb->length);
    if (nE == cb->S)
        return 1; //full
    else
        return 0;
}

void circularBufferAdd(struct CircularBuffer *cb, void* obj) {
    memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);
}
[...]

memcpy 是问题...


看来你本质上是想弄清楚如何抵消void *到已知大小但未知类型的数组元素的地址,以便您可以将其传递给memcpy().

看起来好像,在circularBufferAdd(), cb->E给出要复制到的元素的索引,cb->buffer is the void *到数组,obj是要复制的项目,并且cb->sizeOfType是每个数组元素的大小(并且obj)。在这种情况下,您可以更改:

    memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);

to:

    memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType);

因为你不能使用指针算术void *,你会把它投射到char *。然后,您可以将元素索引乘以元素大小以获得元素的偏移量(以字节为单位),并使用它来获取所需元素的地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C : 在空数组中插入/获取元素 的相关文章

随机推荐

  • 应用内购买在 iOS 5 中不工作

    我已成功将应用程序购买集成到我的应用程序中 我已关注this http www raywenderlich com 21081 introduction to in app purchases in ios 6 tutorial应用程序内购
  • Laravel 5 为特定链接创建路线

    我有一个链接到类似地址 http localhost pages vehicles show 61 http localhost pages vehicles show 61 是否可以为那种链接制定一条路线 我厌倦了下面的路线 但它不起作用
  • 解决 Python 中冲突的包名称

    假设我们有来自同一供应商的两个不同的 Python 包 并且名称相同 foo 一个安装有pip并可以在 usr lib python site packages foo目录 第二个是系统范围的依赖项 您可以使用例如安装apt getPyth
  • 我可以通过外部计费绕过 Apple 的应用内购买机制吗?

    这不是一个编程问题 只是对 iOS 中的应用内购买功能进行澄清 我计划开发一款包含优质内容的应用程序 仅当用户使用凭据进行身份验证时才能使用我的应用程序 我是否可以仅根据身份验证提供优质内容 付费内容 我需要用户通过另一个网络应用程序进行付
  • Phonegap 3.0 InAppBrowser - 不提供用户关闭的方式

    我的应用程序中的 inAppBrowser 工作得很好 但是 我升级了一些东西 现在它打开 URL 而没有任何方式关闭它 你必须杀死该应用程序 我尝试过很多变体 window open http cnn com blank location
  • 使用 CoreAnimation 或 OpenGL 弯曲/扭曲视图以实现轮播效果

    现在我正在用一系列视图填充 UIScrollView 需要扭曲视图以使 UIScrollView 看起来像旋转木马 换句话说 当用户滚动时 它需要像一个圆圈 我以前从未做过类似的事情 但我假设 CoreAnimation 是不可能的 并且需
  • 显示具有共享元素动画的片段

    在我的应用程序中 我有这样的代码 final FragmentTransaction transaction getSupportFragmentManager beginTransaction transaction replace R
  • QTableView:按标题索引-1排序

    我正在使用 PyQt4 并且有一个QTableView有 2 列数据 索引有一个额外的列 它来自headerData源模型的函数 为了在单击标题按钮时进行排序 我用代理类包装了我的模型 这工作正常 但我还想通过单击左上角按钮按第一列排序 c
  • Groovy/Grails 通过 HTTP 发布 XML(使用 REST 插件)

    我正在尝试使用基本身份验证将 XML 字符串 HTTP Post 到 WebMethods 服务器 我试图使用位于 HTTP Builder 之上的 REST 插件 我尝试了一些方法 结果都是 0 长度响应 使用 Firefox 海报 我使
  • 如何在不使用 Play 商店的情况下在移动设备上部署 Flutter 应用程序进行测试

    我是颤振开发的新手 我创建了一个使用谷歌地图和设备位置跟踪的示例应用程序 flutter 2 2 和 VS Code 我想通过部署到我的手机上来进行现场测试 我可以知道在不将应用程序发布到 Play 商店的情况下实现此目标的步骤吗 为您的应
  • 使用本地时区将 unix 时间戳转换为 NSdate

    我得到一些start times and end times形式为NSDecimalNumber从 API 请求返回 我已经成功地能够转换这些NSDecimalNumbers into NSDates 但代码没有考虑时区 我需要它使用设备上
  • 为什么 Boolean.prototype 又是一个 Boolean 对象? (字符串和数字也一样,但日期或正则表达式不一样?)

    In ES5 https www ecma international org ecma 262 5 1 index html sec 15 6 4 Boolean prototype是一个布尔对象 布尔原型对象本身就是一个值为 false
  • 执行 IIFE 后变量值错误(带有函数参数)[重复]

    这个问题在这里已经有答案了 在这个例子中 我通过foo bar到 IIFE 它返回正在执行的第一个参数 我正在传递一个被执行的函数 返回this 指着窗口 因此 返回值存储在a应该是window 那么 为什么它要返回我的论点本身呢 var
  • ansible 解析来自 stdout 的文本字符串

    我的问题是 ansible 和解析标准输出 我需要从 ansible play 中捕获标准输出 并解析此输出以获取标准输出中的特定子字符串 然后保存到 var 中 我的具体用例如下 shell vault sh keystore EAP H
  • 乘以 2 的效率

    我应该以几何方式分配内存并将初始大小设置为 1000 当它被填满时 它将扩展到 2000 4000 等 我的问题是 如果我将初始大小设置为 2 倍 即 1024 在效率或其他方面会有什么不同吗 请不要谈论向量和替代分配方法 这只是理论上的
  • SwiftUI:NavigationLink 在 WatchOS 8.1RC 的 Tabview 中立即弹出

    我发现 watchOS 8 1RC 中存在从 TabView 触发的 NavigationLink 的回归 马上就被驳回了 它在 watchOS 8 0 或模拟器 watchOS 8 0 中运行 你知道解决方法吗 谢谢 示例代码 impor
  • 如何修复:无法在字符串上创建属性“标题”

    我正在尝试使用 jspdf 从 json 数据创建 pdf 但这导致了我无法理解的错误 请帮我解决这个问题 Data fileDataSpecific Date 01 Jan 2019 ServerName prlhpcms01 Serve
  • Android Java JNI和C Char数组无法识别该值

    我试图将 char 数组从 java 传递到 c 我已经用谷歌搜索了实现它的方法 但是当我尝试访问数组的值时 该值不正确 事实上 我试图给数组一个字符 就像buffer i z 在android中结果是正确的 顺便说一句 我想要的值是rs2
  • 使用 AUCTeX 在 Emacs 中使用 \cite 的建议

    我想知道当我在 Emacs AUCTeX 中进行 cite 时如何获得建议 当我执行 C c 时 迷你缓冲区会告诉我 本文档中没有有效的参考书目 并且没有可用的默认参考书目 那么我该如何设置这个默认值呢 我有一个单独的文件 其中包含由主文档
  • C : 在空数组中插入/获取元素

    我必须创建一个可以包含通用数据结构的通用数组 如何将通用结构放入 void 数组的空槽中 这是我的代码 struct CircularBuffer int E int S int length total number of item al