Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运行定义为变量的函数_C - Fatal编程技术网

C 运行定义为变量的函数

C 运行定义为变量的函数,c,C,我有一个用C编写的程序,它包括两个函数,一个函数是main(),另一个函数是预编译的函数,存储为字节数组(我们称之为varFunc())。数组指针在main函数中被强制转换为函数指针,然后从main函数调用。(见下面的代码) 现在,我知道有些操作系统和一些处理器不允许从数据段执行代码,我的varFunc应该就在那里 有没有一种方法可以使用C语言使C编译器向代码/文本部分添加一些变量?若并没有,在大多数编译器中,有并没有一种方法可以通过编译器强制实现这一点 char varFuncArr[

我有一个用C编写的程序,它包括两个函数,一个函数是
main()
,另一个函数是预编译的函数,存储为字节数组(我们称之为
varFunc()
)。数组指针在
main
函数中被强制转换为函数指针,然后从
main
函数调用。(见下面的代码)

现在,我知道有些操作系统和一些处理器不允许从数据段执行代码,我的
varFunc
应该就在那里

有没有一种方法可以使用C语言使C编译器向代码/文本部分添加一些变量?若并没有,在大多数编译器中,有并没有一种方法可以通过编译器强制实现这一点

    char varFuncArr[] = { 0xDE, 0x67, 0x6F, 0x6F, 0xAC, 0x13, 0x05, 0x01, 0xDA, 0xF0, 0xBD, 0x79, 0xA9, 0x10, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0x00, 0x3F, 0x58, 0x13, 0xEA, 0x0A, 0x2E, 0xEE, 0xC7, 0x01, 0x05, 0xD0, 0x6E, 0xB8, 0x9E};

    typedef unsigned long (*funcPtr)(void* d[]);

    int main(int argc, char** argv)
    {
        unsigned int ra[8];
        funcPtr varFunc;
        for (i=0; i<8; i++)
             ra[i] = 0;
        varFunc = (funcPtr)varFuncArr;
        return varFunc(ra);
    }
char varFuncArr[]={0xDE,0x67,0x6F,0x6F,0xAC,0x13,0x05,0x01,0xDA,0xF0,0xBD,0x79,0xA9,0x10,0x00,0x00,0xB8,0x74,0x00,0x00,0x00,0x00,0x3F,0x58,0x13,0xEA,0x0A,0x2E,0xEE,0xC7,0x01,0x05,0xD0,0x6E,0xB8,0x9E};
typedef无符号长(*funcPtr)(void*d[]);
int main(int argc,字符**argv)
{
无符号整数ra[8];
funcPtr-varFunc;

对于GCC中的i=0;i,可以使用<代码>第二属性>((段(“text”))< /C>将某个东西放在特定的部分中;参见文档。VisualC++有<代码>
;有关文档,请参阅。

与Jeremiah Willcock使用编译器属性的建议不同,您可以
mmap
占用一点内存并请求对其执行权限,然后在调用之前将数据复制到那里

您将用平台可移植性(Posix/Windows)换取编译器可移植性(gcc/…),因为它不依赖于特定的编译器,而是依赖于标准Posix函数