leon22
leon22

Reputation: 5669

C function (without parameters) call with parameters

I'm wondering something like this is possible:

// declaration
void func();

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

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

Can someone explain me this and especially how can I access ar in func()?

Upvotes: 3

Views: 7109

Answers (6)

Raunak Mukhia
Raunak Mukhia

Reputation: 388

A hack would be to exploit the GCC calling convention.

For x86, parameters are pushed into stack. Local variables are also in the stack.

So

void func()
{
   int local_var;
   int *ar;
   uintptr_t *ptr = &local_var;
   ptr += sizeof(int *);
   ar = (int *)ptr;

May give you the array address in ar in x86.

For x86_64, the first parameter is stored in rdi register.

void func()
{ 
    uintptr_t *ptr;
    int *ar;
    asm (
    "movq %%rdi, %0"   
    :"=r"(*ptr)
    :
    :"rdi");
    ar = (int *)ptr;

May give you the array address in ar in x86_64.

I have not tested these code myself and you may be to fine tune the offsets yourself.

But I am just showing one possible hack.

Upvotes: 3

Anbu.Sankar
Anbu.Sankar

Reputation: 1346

If you want to use any function with no parameters with any return type, it should be declared as (In C)

return_type func(void). It is only generic way of function declaration.

But any how, for your question , it possible to access but not generic..Try this program...

  #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;
 }

Even this program works fine, it is not generic way and also is undefined.

if you declare function like void func (void) ,it will not work.

Upvotes: 1

SCO
SCO

Reputation: 1932

So that you can do something with func(), you need to pass it the input data you'll work with.

First you must declare the function properly :

// declaration
 void func(int []);

The define it :

void func( int a[] )
{
   // do something
   printf ("a[0] = %d\n", a[0]);
}

Full code :

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

This will display : a[0] = 1

Upvotes: 0

zegkljan
zegkljan

Reputation: 8421

In C (not C++), a function declared as func() is treated as having an unspecified number of untyped parameters. A function with no parameters should be explicitly declared as func(void).

Upvotes: 10

Azael
Azael

Reputation: 654

You can't access ar in func(), since you dont have a reference to it in func().

It would be possible if ar would be a global var or you have a pointer on it.

Upvotes: 0

mahendiran.b
mahendiran.b

Reputation: 1323

You can implement something like this.

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

}

Upvotes: -1

Related Questions