- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以 C99 支持常用的“灵活数组成员”hack 让我们可以制作 struct
可以过度分配以满足我们的大小要求。我怀疑在大多数理智的实现中这样做是完全安全的,但是如果我们知道在某些情况下我们不需要 struct
的某些成员,那么在 C 中“分配不足”是否合法? ?
假设我有一个类型:
struct a {
bool data_is_x;
void * data;
size_t pos;
};
如果data_is_x
, 然后是 data
的类型是一种需要使用 pos
的类型成员。否则,使用此 struct
的函数不需要 pos
struct
的这个特定副本的成员.本质上,struct
携带有关它是否有 pos
的信息成员(member),此信息不会在struct
内更改的一生(除了邪恶的恶作剧,无论如何都会破坏任何东西)。可以安全地说:
struct a *a = malloc(data_is_x ? sizeof(struct a) : offsetof(struct a, pos));
这将为 pos
分配空间仅在需要时加入?或者它是否违反了使用对 struct
来说太小的施法空间的约束指针,即使您从不使用相关成员?
我的真实用例有点复杂;它在这里主要是为了让您了解为什么我想这样做:
typedef struct {
size_t size;
void * data;
size_t pos;
} mylist;
mylist_create
的代码指定,对于 size > 0
, data
是一组连续数据,即 size
项目长(无论项目可能是什么),但对于 size == 0
它是包含项的双向链表的当前节点。所有适用于 mylist
的函数s 将检查是否 size == 0
.如果是这样,他们会将数据作为链表处理,“当前”索引是任何节点data
。指着。如果不是,他们会将数据作为数组处理,“当前”索引存储在 pos
中。 .
现在如果size == 0
我们真的不需要 pos
成员,但如果size > 0
我们将。所以我的问题是,这样做是否合法:
mylist *list = malloc(size ? sizeof(mylist) : offsetof(mylist, pos));
如果我们保证(对未定义行为的惩罚),而size == 0
,我们永远不会尝试(或需要)访问 pos
成员?或者它是否在标准中的某个地方说,甚至考虑这样做是 UB?
最佳答案
malloc
本身根本不关心您为结构分配了多少内存,它是未定义的 block 外部内存的解引用。来自 C99 6.5.3.2 地址和间接运算符
:
If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.
并且,从7.20.3 内存管理函数
,我们发现(我的斜体):
The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object and then used to access such an object or an array of such objects in the space allocated (until the space is explicitly deallocated).
因此,您可以执行以下操作:
typedef struct { char ch[100]; } ch100;
ch100 *c = malloc (1);
而且,如果您只尝试使用 c->ch[0]
做任何事情,这是完全可以接受的。
对于您具体的具体示例,假设您关心的是存储空间,我不太确定自己会那么担心。如果您出于其他原因担心,请随时忽略这一点,特别是因为其中包含的假设不是标准强制要求的。
根据我的理解,你有一个结构:
typedef struct {
size_t size;
void * data;
size_t pos;
} mylist;
你只想使用 data
其中 size
是 0,同时使用 data
和 pos
其中 size
大于 0。这排除了将 data
和 pos
放在 union 中的使用。
大量的 malloc
实现会将您请求的空间四舍五入为 16 字节的倍数(或更大的 2 的幂),以缓解内存碎片问题。这当然不是标准要求的,但它很常见。
假设(例如)32 位指针和 size_t
,您的 12 字节结构很可能会占用 16 字节的竞技场 header 和 16 字节的数据 block 。即使您只要求 8 个字节(即没有 pos
),这个 block 仍然是 16 个字节。
如果你有 64 位指针和 size_t
类型,它可能会有所不同 - 24 字节有 pos
和 16 没有。
但即便如此,除非您分配很多这些结构,否则这可能不是问题。
关于c - 分配太少的空间是否安全(如果你知道你不需要它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7356431/
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!