[英]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.