簡體   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