按照标准,从函数指针访问数据是否合法?
比如:
#include <stdio.h>
int test(){
//
}
int main() {
int (*fp)(void) = &test;
int i=0;
for(i; i<10; ++i)
printf("%x", *(fp+i));
}
在 ideone 上运行,看起来它运行正常 - 但我想知道这是否是预期的结果,或者是否实现定义,并且该页面可能会被操作系统保护?
按照标准,从函数指针访问数据是否合法?
比如:
#include <stdio.h>
int test(){
//
}
int main() {
int (*fp)(void) = &test;
int i=0;
for(i; i<10; ++i)
printf("%x", *(fp+i));
}
在 ideone 上运行,看起来它运行正常 - 但我想知道这是否是预期的结果,或者是否实现定义,并且该页面可能会被操作系统保护?
函数指针是经过设计合法的。
自己操作指针也是经过设计合法的,但可能会导致未定义的行为,包括程序崩溃。
我尝试将循环扩展到10000,结果出现了运行时错误,可能是因为内存访问被禁止了。
*(fp+i)
看起来像是一个解引用。 - Diego
char*
,因为函数不是对象,没有大小;您依赖于GCC的扩展,它将void*
或函数指针上的指针算术定义为字节增量。至于页面保护,不用担心:从逻辑上讲,代码必须是可读的才能被执行(否则,您将如何知道要运行什么?)。 - Iwillnotexist Idonotexist.rodata
,r--
)、读写数据段(.data
,rw-
)和可执行代码(.text
,r-x
)。 - Iwillnotexist Idonotexistvoid foo(void){}
和int bar = 0;
,可能会出现(void*)&foo == (void*)&bar
的情况——尽管它们不在同一位置,但它们具有相同的地址。因此,您可能会尝试访问地址 A 处的 程序 内存,但实际上却访问了 数据 内存。 - Iwillnotexist Idonotexist