我一直在使用下面的源代码尝试“动态调用函数”。在使用仅接受前两个参数的 testing_function 成功测试此代码后,我添加了第三个并决定在调用该函数时“不提供参数”。我注意到,当我这样做时,第三个参数的值不是(必然)0,而是一个我不知道其来源的“随机”值。
问题如下:
- 这些价值观从何而来?
- 另外,如何将参数传递给函数?
- 不传递论点是不好的做法吗?
- 是否可以在不使用函数重新编译代码的情况下准备添加函数的参数?(例如:动态加载的库的函数获得一个可接受的参数,但使用该函数的代码不会被重新编译)。
源代码前言如下:
我正在使用 Linux 运行,使用 GCC 4.6.3 编译/调用链接器,并且在使用此代码时没有收到编译/链接警告/错误。此代码“完美”执行。我调用 gcc 如下:
gcc -x c -ansi -o (output file) (input file, .c suffix)
源代码如下:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
/* Function for testing. */
int testing_function(char* something, char* somethingelse, int somethingadditional)
{
int alt_errno = errno;
if ((something != NULL)&&(somethingelse != NULL))
{
errno = 0;
if (fprintf(stdout, "testing_function(\"%s\", \"%s\", %d);\n", something, somethingelse, somethingadditional) <= 0)
{
if (errno != 0)
{
int alt_alt_errno = errno;
perror("fprintf(stdout, \"testing_function(\\\"%%s\\\", \\\"%%s\\\", %%d);\\n\", something, somethingelse, somethingadditional)");
errno = alt_errno;
return alt_alt_errno;
}
else
{
errno = ENOSYS;
perror("fprintf(stdout, \"testing_function(\\\"%%s\\\", \\\"%%s\\\", %%d);\\n\", something, somethingelse, somethingadditional)");
errno = alt_errno;
return ENOSYS;
}
}
else
{
errno = alt_errno;
return 0;
}
}
else
{
errno = ENOSYS;
perror("testing_function(char* something, char* somethingelse, int somethingadditional)");
errno = alt_errno;
return ENOSYS;
}
}
/* Main function. */
int main(int argc, char** argv)
{
int (*function)(char*, char*);
*(void**) (&function) = testing_function;
exit(function("Hello", "world!"));
}