我想知道这样的事情是可能的:
// 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()
?
答案 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)
这样的函数,它将不起作用。