C函数(不带参数)调用参数

时间:2014-10-07 08:38:57

标签: c function

我想知道这样的事情是可能的:

// declaration
void func();

int main()
{
    int ar[] = { 1, 2, 3 };
    func(ar); // call with parameter
    return 1;
}

void func() // no parameters
{
    // do something
}

有人可以解释一下这一点,尤其是如何在ar中访问func()

6 个答案:

答案 0 :(得分:9)

在C(非C ++)中,声明为func()的函数被视为具有未指定数量的无类型参数。没有参数的函数应该显式声明为func(void)

答案 1 :(得分:2)

黑客就是利用GCC调用约定。

对于x86,参数被推入堆栈。局部变量也在堆栈中。

所以

void func()
{
   int local_var;
   int *ar;
   uintptr_t *ptr = &local_var;
   ptr += sizeof(int *);
   ar = (int *)ptr;

可以在x86中为ar提供数组地址。

对于x86_64,第一个参数存储在rdi寄存器中。

void func()
{ 
    uintptr_t *ptr;
    int *ar;
    asm (
    "movq %%rdi, %0"   
    :"=r"(*ptr)
    :
    :"rdi");
    ar = (int *)ptr;

可以在x86_64中为您提供ar中的数组地址。

我自己没有测试过这些代码,你可能会自己调整偏移量。

但我只是展示了一个可能的黑客。

答案 2 :(得分:1)

您无法在func()中访问 ar ,因为您在func()中没有对它的引用。

如果 ar 是全局变量,或者你有一个指针就可以了。

答案 3 :(得分:1)

为了使用func()可以执行某些操作,您需要将它与您一起使用的输入数据传递给它。

首先,您必须正确声明该功能:

// declaration
 void func(int []);

定义它:

void func( int a[] )
{
   // do something
   printf ("a[0] = %d\n", a[0]);
}

完整代码:

#include <stdio.h>

// declaration
 void func(int []);

int main()
{
   int ar[] = { 1, 2, 3 };
   func(ar); // call with parameter
   return 1;
}

void func( int a[] )
{
   // do something
   printf ("a[0] = %d\n", a[0]);
}

这将显示: a [0] = 1

答案 4 :(得分:0)

你可以实现类似的东西。

void func(int *p, int n);

int main()
{
    int ar[] = { 1, 2, 3 };
    func(ar, sizeof (ar)/sizeof(ar[0]) ); // call with parameter
    return 1;
}

void func(int *p, int n) // added 2 parameters
{
    int i=0;

    for (i=0; i<n; ++i){
        printf ("%d ", p[i]);
        }

}

答案 5 :(得分:0)

如果你想使用任何没有参数和任何返回类型的函数,它应该被声明为(在C中)

return_type func(void)。它只是函数声明的通用方式。

但是,对于你的问题,你可以访问但不是通用的任何方法。试试这个程序......

  #include<stdio.h>
  int *p;

  void func();

  int main()
  {
    int ar[] = { 1, 2, 3 };
    p=ar;
    printf("In main %d\n",ar[0]);
    func(ar); // call with parameter
    printf("In main %d\n",ar[0]);
   return 1;
 }

 void func() // no parameters
 {
  printf("In func %d \n",*p);
    *p=20;
 }

即使这个程序工作正常,它也不是通用的方式,也是未定义的。

如果你声明像void func (void)这样的函数,它将不起作用。