malloc + size_t * 3 的地址对于任何类型都是对齐的吗?

2024-04-10

我正在构建一种动态数组(向量),但不是嵌入数据(通常是void *) 变成struct vector,我正在预留空间struct vector+ 一大块字节,使用数组的示例size_t's:

#include <stdio.h>
#include <stdlib.h>

struct vector {
    size_t capacity;
    size_t typesize;
    size_t size;
};

#define VECTOR(v) ((struct vector *)((unsigned char *)v - sizeof(struct vector)))

static void *valloc(size_t typesize, size_t size)
{
    struct vector *vector;
    unsigned char *data;

    data = calloc(1, sizeof(*vector) + typesize * size);
    if (data == NULL) {
        return NULL;
    }
    vector = (struct vector *)data;
    vector->typesize = typesize;
    vector->capacity = size;
    vector->size = 0;
    return data + sizeof(*vector);
}

static void *vadd(void *data)
{
    struct vector *vector = VECTOR(data);
    unsigned char *new;
    size_t capacity;

    if (vector->size >= vector->capacity) {
        capacity = vector->capacity * 2;
        new = realloc(vector, sizeof(*vector) + vector->typesize * capacity);
        if (new == NULL) {
            return NULL;
        }
        vector = (struct vector *)new;
        vector->capacity = capacity;
        vector->size++;
        return new + sizeof(*vector);
    }
    vector->size++;
    return data;
}

static size_t vsize(void *data)
{
    return VECTOR(data)->size;
}

static void vfree(void *data, void (*func)(void *))
{
    struct vector *vector = VECTOR(data);

    if (func != NULL) {
        for (size_t iter = 0; iter < vector->size; iter++) {
            func(*(void **)((unsigned char *)data + iter * vector->typesize));
        }
    }
    free(vector);
}

int main(void)
{
    size_t *data;

    data = valloc(sizeof(size_t), 1);
    if (data == NULL) {
        perror("valloc");
        exit(EXIT_FAILURE);
    }
    for (size_t i = 0; i < 10; i++) {
        data = vadd(data);
        if (data == NULL) {
            perror("vadd");
            exit(EXIT_FAILURE);
        }
        data[i] = i;
    }
    for (size_t i = 0; i < vsize(data); i++) {
        printf("%zu\n", data[i]);
    }
    vfree(data, NULL);
    return 0;
}

问题是:结果的地址是malloc (void *) + 的大小struct适合任何类型?这段代码的行为定义是否明确?


malloc + size_t * 3 的地址对于任何类型都是对齐的吗?

不,不一定。

确定基本对齐通过使前缀数据也为基本对齐.

一种方法是使用union of struct vector and max_align_t。的大小union uvector将是的倍数基本对齐.

max_align_t这是一种对象类型,其对齐方式与实现所支持的一样大 在所有情况下;

union uvector {
  max_align_t a;
  struct vector {
    size_t capacity;
    size_t typesize;
    size_t size;
  } v;
};

union uvector *uvector;
unsigned char *data;

data = calloc(1, sizeof *uvector ...
...
return data + sizeof *uvector;

答案有一些低效 - 在另一个答案中重新设计..

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

malloc + size_t * 3 的地址对于任何类型都是对齐的吗? 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • Service Worker 注册时出错

    我正在尝试注册服务工作者 但出现以下错误 注册ServiceWorker失败 当前的URL协议 不支持原点 null 我在 localhost 下使用 Node js 我有我的索引 html and service worker js在同一
  • 使用 es2017 的 async wait 重构 Promise 和 Promise.all

    我有一个照片上传处理程序的工作版本 但我想看看它如何与异步等待一起工作 在下面的内容之前是我使用 Promise 的工作代码 onChangePhotos e gt e preventDefault let files e target f
  • 如果单元测试失败则 make 失败

    我有一个用于编译静态库的 makefile 该生成文件具有编译与静态库关联的单元测试套件的规则 编译测试套件后 将调用 python 脚本来运行测试并记录结果 它看起来像这样 unit MAKE C cXbase unit python T
  • 如何在ssl连接期间加载客户端证书以进行相互身份验证?

    我无法在 ssl 连接上加载客户端证书 以便服务器可以对其进行身份验证 可能是什么问题 LoadCertificates 函数可以正常加载服务器证书 我能够在客户端获取服务器证书 但无法在服务器端获取客户端证书 我还想验证证书是否由正确的
  • Javascript?:如何动态添加文本输入/表单字段到 HTML 表单?

    我正在构建一个网络表单 其中有一个输入列表 到目前为止 一切都很好 但是 如何添加链接 按钮以将另外 5 个字段添加到列表中 例如
  • Xcode 4 卡在“扫描工作副本”上

    我刚刚归档并提交了一个项目 当我返回打开该项目时 它挂在 扫描工作副本 上 我可以导航 但无法查看项目文件 这实际上只是一个链接问题 选择您的项目并确保您已打开 身份和类型 它位于右侧编辑器栏中 使用 查看 按钮切换打开和关闭 您可以在那里
  • FFmpeg 支持哪些编解码器和格式? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我需要 FFmpeg 支持的编解码器和格式列表 我在哪里可以找到它 正确的编解码器 ffmpeg codecs Formats ffm
  • findOrCreate 与 include -sequelize.js

    我想创建一个比赛 如果不存在 以及Match 如果不存在 与锦标赛关联 let match created await Match findOrCreate where scoreHome 97 Tournament name USA So
  • PhpStorm 资源根的相对路径

    我使用 PhpStorm 9 并且我的项目结构与此类似 src elements element alfa element alfa html element alfa scss templates application html ind
  • 无法删除 nav_host_fragment 顶部的空间

    我刚刚实现了底部导航 AS 的默认设置 文件 gt 新建 gt 活动 gt 底部导航活动 除了顶部的空格之外 一切都很好nav host fragment 由于它是在 ConstraintLayout 中生成的 我尝试清理约束并设置顶部约束
  • 为什么 file_get_contents 不起作用?

    为什么file get contents not为我工作 在下面的测试文件代码中 似乎我搜索过的每个示例都列出了此函数 但它从未被执行 这是网络托管服务的问题吗 有人可以在他们的服务器上测试这段代码只是为了看看地理编码数组输出是否真的作为字
  • 无法通过 ngrok ssh 进入远程 Linux

    远程Linux计算机位于内部网络中 没有公共IP地址 所以我安装了ngrok ngrok tcp 22 ngrok by inconshreveable Ctrl C 退出 在线隧道状态版本2 0 19 2 0 17网页界面http 127
  • 如何在 django 评论中包含用户个人资料的图像/徽标

    我已将其发布在 django users 上 但尚未收到回复 所以我有自己的用户配置文件对象 用户的子类 其中一个字段是 imagefield 它 显然 用于用户上传他们的徽标 缩略图 问题是我如何才能将其包含在他们的评论中 有任何想法吗
  • phpMyAdmin 4.0.5 导出错误错误 - 有人知道它是否正在得到解决吗?

    phpMyAdmin 宣布 在 2013 年 9 月 1 日的几天内 他们将关闭其他资源 例如邮件列表和论坛 并推迟我们使用 StackOverflow StackExchange 我为小型 cPanel 托管服务提供一般支持 我的部分职责
  • Entity Framework Core - 未找到设计时服务

    我有一个非常基本的迁移文件 我正在执行dotnet ef database update verbose在包管理器控制台窗口中 SQL Server 中没有生成任何内容 包管理器控制台窗口中的最后几行输出如下所示 Finding desig
  • Nexus 5 上启动器图标的实际大小是多少?

    As the doc http developer android com design style iconography html launcher提到的 启动器图标是48 48dp 所以我认为我的 Nexus 5 上的启动器图标应该是
  • 更新列表框而不丢失所选项目,WPF

    列表框每秒更新一次 在工作期间 我需要选择其中的一些项目并执行命令 这是不可能的 因为列表框已更新并丢失了其选定的项目 ObservableCollection 是我列表中的 ViewModel 我心里有一些选择 也许还有更好的解决方案 检
  • 如何使用带有数据绑定的 Ext5 组合框

    我想使用一个组合框 它从数据绑定接收预选值 并且还从同一存储的数据绑定接收可能的选项 面板项配置如下所示 xtype combobox name language default fieldLabel Default Language mu
  • 函数调用后,参数指针不会保留其值[重复]

    这个问题在这里已经有答案了 我将 3 个指针 key K1Ptr K2Ptr 作为参数传递给函数 keyGenerator 但是当函数调用结束时 只有 key 指针保留函数调用中的值 而其他 2 个指针则不保留 我尝试了很多不同的事情 比如
  • malloc + size_t * 3 的地址对于任何类型都是对齐的吗?

    我正在构建一种动态数组 向量 但不是嵌入数据 通常是void 变成struct vector 我正在预留空间struct vector 一大块字节 使用数组的示例size t s include