以下代码会引发 EXC_BAD_ACCESS 错误(特别是一般保护错误错误),我想知道为什么您不能错位块指针并执行它。
#include <stdio.h>
int main(int argc, const char * argv[])
{
void (^blocky)() = ^{
printf("Hello!\n");
printf("Hello Again!\n");
};
blocky = *(&blocky+1);
blocky = *(&blocky-1);
blocky();
return 0;
}
但以下工作:
#include <stdio.h>
int main(int argc, const char * argv[])
{
void (^blocky)() = ^{
printf("Hello!\n");
printf("Hello Again!\n");
};
blocky = *(&blocky+1-1);
blocky();
return 0;
}
编辑(对错位代码块的回答):
如果将块视为结构,您会发现指向内存中可执行代码的值距块开头偏移 16 个字节,长度为 8 个字节。
您可以有效地更改此值,将执行指向内存中的另一个位置。一般来说,这会崩溃。
假设您知道另一段可执行代码在内存中的特定地址,您可以将其指向那里。
为什么这是有用的:它不是。永远不要这样做。真的。绝不。