12Bits
12Bits

Reputation: 85

C - Trouble passing array reference to pointer argument in function

I'm having trouble passing an integer array as a reference, and then modifying the original array.

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i[10]){
    *i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(&i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
}

Compiler complains about invalid type

[vinessa@komputilo ch1]$ gcc test.c
    test.c: In function ‘setToFive’:
    test.c:5:5: error: invalid type argument of unary ‘*’ (have ‘int’)
        5 |     *i[2] = 5;
          |     ^~~~~
    test.c: In function ‘main’:
    test.c:11:15: warning: passing argument 1 of ‘setToFive’ from incompatible pointer type [-Wincompatible-pointer-types]
       11 |     setToFive(&i);
          |               ^~
          |               |
          |               int (*)[10]
    test.c:4:21: note: expected ‘int *’ but argument is of type ‘int (*)[10]’
        4 | void setToFive(int *i){
          |                ~~~~~^

segmentation fault

[vinessa@komputilo ch1]$ ./a.out
Segmentation fault (core dumped)

Have been banging head at problem for hours, please help.

Upvotes: 2

Views: 57

Answers (2)

Vlad from Moscow
Vlad from Moscow

Reputation: 310950

Here you are

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i){
    i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(i);
    printf("%d\n", i[2]);
}

If you want to change elements of an array then just pass it by value. In this case the array designator is implicitly converted to pointer to its first element. Using the pointer and the pointer arithmetic you can change any element of the array.

In fact in this case you are passing elements of the array by reference indirectly through a pointer to them.

Pay attention to that these function declarations

void setToFive(int i[100]);
void setToFive(int i[10]);
void setToFive(int i[1]);
void setToFive(int i[]);

are equivalent and declare the same one function declaration of which the compiler adjusts to the following declaration

void setToFive(int *i);

That is as a result the function deals with a pointer.

As for the expression used as an argument in this function call

setToFive(&i);

then it has the type int ( * )[10] because the pointed array is declared like

int i[10];

It is not the same as the type of the parameter int *i[10] that as I already wrote is adjusted by the compiler to the type int **.

Upvotes: 3

Adrian Mole
Adrian Mole

Reputation: 51825

You are passing an array of pointers to integers, not an array of integers. You can just remove the various * declarations and operators, and just pass a simple array as the argument (the array argument will decay to a pointer):

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int i[10])
{
    i[2] = 5;
    printf("hello\n");
}

int main()
{
    int i[10];
    setToFive(i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
    return 0;
}

Upvotes: 1

Related Questions