- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我相信我已经找到了一种方法来实现类似可移植 C89 中众所周知的“struct hack”的方法。我很好奇这是否真的严格符合 C89。
主要思想是:我分配足够大的内存来容纳初始结构和数组元素。确切的大小是 (K + N) * sizeof(array_base_type)
,其中选择 K
以便 K * sizeof(array_base_type) >= sizeof(the_struct)
和 N
是数组元素的数量。
首先,我取消引用 malloc()
返回的指针以存储 the_struct
,然后我使用指针算法获得指向结构后面数组开头的指针.
一行代码胜过一千字,所以这里是一个最小的实现:
typedef struct Header {
size_t length;
/* other members follow */
} Header;
typedef struct Value {
int type;
union {
int intval;
double fltval;
} v;
} Value;
/* round up to nearest multiple of sizeof(Value) so that a Header struct fits in */
size_t n_hdr = (sizeof(Header) + sizeof(Value) - 1) / sizeof(Value);
size_t n_arr = 42; /* arbitrary array size here */
void *frame = malloc((n_hdr + n_arr) * sizeof(Value));
if (!frame)
return NULL;
Header *hdr = frame;
Value *stack_bottom = (Value *)frame + n_hdr;
我主要担心的是最后两个赋值(使用 frame
作为指向 Header 的指针和指向 Value 的指针)可能会违反严格的别名规则。但是,我没有将 hdr
取消引用为指向 Value 的指针 - 它只是在 frame
上执行的指针运算,以便访问值数组的第一个元素,所以我没有使用不同类型的指针有效地访问相同对象。
那么,这种方法是否比经典的 struct hack(已被官方认为是 UB)更好,或者它也是 UB?
最佳答案
“显而易见的”(好吧......不是很明显,但它是 我 想到的 :-) )导致它中断的方法是使用一个向量化编译器,它以某种方式决定可以将 64 个 Header
从来自 malloc 的
总是分配足够的空间来进行矢量化。将 vector 寄存器存储回内存可能会覆盖其中一个 hdr
的 42 舍入到 64+ 区域加载到 vector 寄存器中Value
。
我认为这个矢量化编译器可以指向标准(好吧,如果编译器有手指......)并声明符合性。
不过,在实践中,我希望这段代码能够正常工作。如果您遇到矢量化编译器,请添加更多空间(使用可以插入最小值的机器相关宏进行四舍五入)并继续。 :-)
关于旧 "struct hack"(?) 的符合变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310789/
我希望在我的页面上使用一些吸引眼球的实验性 CSS,例如 border-radius(圆 Angular )和渐变。不幸的是,Internet Explorer 还不支持任何这些。至少 border-
我不喜欢微软的字体渲染。 我为客户创建了一个站点,我的调试列表中最后一个未选中的框是最大的。 (顺便说一句,它还没有“上线”,所以请忽略任何其他错误 - http://baked-beans.tv/b
一般情况下,当我们想在同一页面显示某个网页的内容时,我们会使用ajax请求。如果说,我使用 AJAX 请求不同域中的网页,由于跨端脚本错误,这是不允许的。但是为什么允许通过服务器端页面访问。例如我们可
在我的 css 代码中,我有一些 hack,我想影响 IE6/7 #topmenu li a.activa, #topmenu li a.activa:hover{ *background:
在过去的两个月里,我一直在试图“愚弄”safari,让它认为它正在查看服务器上的一个文件,这实际上是来自摄像机的实时视频流,根据请求使用 Gstreamer 编码和混合成一种格式这是浏览器支持的。由于
怎么说呢,相信很多考过竞赛的同学都会在平时的练习/考试中遭遇过100分但没有AC的情况,结果一看评测结果:subtask的数据点没过! 这时候就是遇到hack数据了,如果被这类数据卡住,说明你
Avast 不时出现在我的一个网站上。有点奇怪,因为我对安全性非常严格,但我检查了 index.php 文件和所有相关的包含和脚本。在我删除的“header.php”文件中发现了一些奇怪的 PHP 代
所以我使用一个程序,我在 lua 中编写 mods,lua 处于沙箱状态,这意味着大多数功能都被阻止,如 IO 和 OS,我什至不能使用 REQUIRE 添加库。我需要一个功能来解压缩我的一个 mod
在 Wiki page for Sudoku solutions ,一种解决方案声称使用“Dot Hack”。链接的 Github 页面不再可用,我在别处找不到任何关于它的信息。 这是关于什么的?它有
嗨, friend 们,是否有可能获得像这样 100% 宽度和高度的双色背景 这是示例图像: Sample Image http://www.mediaserveit.com/demo/vivek/r
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一个网站使用来自谷歌字体的自定义字体。在我的网站上它是正常对齐的,但在我的 android 上,源不对齐。通过各种移动技巧进行研究,我想知道它们是否真的有效,因为经过一项一项的测试,它并没有奏效。
我正在使用... background:url(menu-bg.png) repeat-x, url(spot.gif) repeat; background:url(spot.gif)\0/; 在
我尝试隐藏/显示 div“游戏类型”,但如果输入复选框在列表项中,则以下代码不会运行,我不明白为什么 是否可以在不使用 js 的情况下使用“no-game”输入禁用“pc”和“xbox”输入? inp
简单的问题:我正在 HTML5/Socket.io 中构建一个多人游戏,并使用 Phaser 作为游戏框架。我现在已经进入了为黑客行为添加预防措施的阶段了。 基本上我的问题很简单:潜在的黑客是否可以实
是否有任何方法(hack)插入 Python 函数(def)通过引用返回结果,即使对于不可变类型也是如此? 提案申请(swap as subroutine): def swap(a, b): ....
谁能帮我解决这个问题。我是 css 样式的新手。我有一个 css 文件,其中包含我要构建的 asp.net 网站的所有样式。然而,它在安装了 IE 7 的服务器上运行良好,当我尝试使用 chrome、
以下制作可变大小结构的方法有什么问题? struct tode{ int g; int *p; }; struct tode *lp = malloc(sizeof
我已经停止为不同的浏览器使用 CSS hack,而是支持“条件注释将类添加到 html 标记”方法。 这让我想到了我的问题。我如何编写这个 ie8 hack 没有 hack? .grab-cursor
这样的闭包实现有什么问题吗(从python hack中偷来的)? void function(int value) { struct closure { closure(int
我是一名优秀的程序员,十分优秀!