繁体   English   中英

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

[英]C function (without parameters) call with parameters

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

// declaration
void func();

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

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

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

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

黑客将是利用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中的数组地址。

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

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

你不能在func()中访问ar ,因为你在func()中没有对它的引用。

如果ar是全局var或者你有一个指针就有可能。

因此,您可以使用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

你可以实现这样的东西。

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]);
        }

}

如果要使用任何没有带任何返回类型的参数的函数,则应将其声明为(在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) ,它将无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM