这个功能分配如何工作?

时间:2016-04-16 14:15:58

标签: c function-pointers

我正在从我的大学书中学习一些C代码(本书的主题是Linux编程),我遇到了一些我不理解的代码。我做了一些研究,但我没有在互联网上找到任何东西。有人可以向我解释这段代码吗?

我知道环境变量是什么,我不理解的部分是这个int (*det)(), det()函数是如何工作的。对不起,如果我的标题不正确,我只是不知道如何更好地描述这个主题。

#include<stdio.h>

int main(){
    int (*det)();
    det = getenv("foo");      
    det();
    return 0;
}

***感谢您的回复。有没有办法让这个程序正常运行,例如打印“hallo”?

2 个答案:

答案 0 :(得分:5)

一般来说,它不起作用。您正在尝试将char*(字符串)分配给函数指针。合理的编译器会拒绝这一点。

但是,并非所有编译器都合理。如果您确实设法编译并执行此代码,那么您已经创建了一个易受环境变量foo攻击的程序。这是因为如果您确实设法执行foo的内容,并且它们确实可以在您的计算机上执行,那么您将把进程的控制权从C程序转移到{{1}中存在的任何代码中}。这是不可移植的,可能是非工作的,绝对不安全,绝不应该尝试。

此外,你从中得到这本书的书是一种关于信息安全的东西。如果没有,请将其烧掉。

答案 1 :(得分:1)

正如有人已经指出的那样

det = getenv("foo"); 

没有多大意义,我希望你的编译器足够聪明 你不会侥幸逃脱它。可能是你期望在那本书中看到的:

#include <stdio.h>
#include <stdlib.h>

extern char* getenv(const char*);
/* The above statement is not mandatory but would make the code more 
 * readable. The keyword "extern" here implies that the function is 
 * is defined elsewhere.
 */

int main(void)
{
    char* (*det)(const char*) = getenv;
    printf("PATH env variable contains : %s\n", (*det)("PATH"));
    /* Replace path with your own environment variable */
    printf("Press any key to continue..\n");
    getchar();
    return 0;
} 

我只是在这里打印一些东西,改变用法以满足你的需求。

<强>参考

getenv()原型在这里。