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