任何人都可以解释与功能的误解吗?

时间:2016-04-16 00:23:31

标签: c function

我想了解为什么我们写这个int foo(char *buf); 这个DWORD MyExceptionHandler(void); int foo(char *buf); ,在这个例子中两次。

为什么我们在不编写定义的情况下编写这些函数:

#include <windows.h>
#include <stdio.h>

DWORD MyExceptionHandler(void);
int foo(char *buf);

int main(int argc, char *argv[])
{
        HMODULE l;
        l = LoadLibrary("msvcrt.dll");
        l = LoadLibrary("netapi32.dll");
        printf("\n\nHeapoverflow program.\n");
        if(argc != 2)
                return printf("ARGS!");
        foo(argv[1]);
        return 0;
}

DWORD MyExceptionHandler(void)
{
        printf("In exception handler....");
        ExitProcess(1);
        return 0;
}

int foo(char *buf)
{
        HLOCAL h1 = 0, h2 = 0;
        HANDLE hp;

        __try{
                hp = HeapCreate(0,0x1000,0x10000);
                if(!hp){
                        return printf("Failed to create heap.\n");
    }
                h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,260);

                printf("HEAP: %.8X %.8X\n",h1,&h1);

                // Heap Overflow occurs here:
                strcpy(h1,buf);

                // This second call to HeapAlloc() is when we gain control
                h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,260);
                printf("hello");
        }
        __except(MyExceptionHandler())
        {
                printf("oops...");
        }
        return 0;
}

示例:

getline

1 个答案:

答案 0 :(得分:3)

必须先声明一个函数才能调用它。有两种方法可以做到:

  1. 您可以将整个函数定义放在调用它的任何函数的定义之前。该定义也可作为声明。

  2. 您可以在调用它的任何函数的定义之前放置函数的原型。这只是声明函数的参数和返回类型。该定义可以稍后放置,甚至可以放在稍后链接的另一个编译单元中。

  3. 许多程序员喜欢将所有功能的原型放在文件的开头。这允许他们以任何顺序放置定义,而不是跟踪哪些调用可以使所有依赖项正确。特别是,它允许您首先放置main()函数,这样可以更容易地遵循程序的逻辑。