Paulshaq
Paulshaq

Reputation:

Pointer issue in C

Greetings, I am trying to learn pointers in C, I simply want my "addtwo" function to add 2 to every element of the input integer array, yet I get odd compilation errors, here is the non-pointer version which indeed won't properly compile.

addtwo(int *arr[]) {
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++) {
        arr[i] = arr[i] + 2;
    }
}

main() {
    int myarray[] = {1,2,3,4};
    addtwo(myarray);
}

Regards

Upvotes: 2

Views: 373

Answers (7)

Vlad Gudim
Vlad Gudim

Reputation: 23502

addtwo argument declaration really reads:

arr is an array of pointers to integer

when you probably really want

a pointer to an array of integers

"How to Read C Declarations" has really helped me to grok the topic a while ago, maybe it will do the same for you.

Upvotes: 0

Martin Beckett
Martin Beckett

Reputation: 96167

addtwo(int *arr[]) should be addtwo(int *arr)

You cannot use sizeof to get the size of an array from a pointer. Typically you would either pass the size of the array as a separate arg or have some special value marking the last element.

Upvotes: 3

DeadHead
DeadHead

Reputation: 2239

Not to do with the compile error, but...

You have to pass sizeof(arr) to the function instead of calling it in the function. When an array is passed to a function, C no longer sees it as an array, but as a single pointer to memory, so that sizeof(arr) as you are calling it now, will return the size of the pointer arr, which is most likely 4.

Here's what I mean in code:

void addtwo(int *arr, int size){
    int i=0;
    for(;i< size;i++){
        arr[i] = arr[i] + 2;
    }
}

int main(){
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof(arr)/sizeof(int));
    return 0; 
}

Upvotes: 3

James Black
James Black

Reputation: 41848

Though others already gave the correct response, basically you have an array of pointers when you have

int *arr[]

I doubt that is what you want. If you have

int arr[]

then that will also be equivalent to

int *arr

Upvotes: 0

Johannes Schaub - litb
Johannes Schaub - litb

Reputation: 507243

You've some problems. First, you try to pass a int* to a parameter that's type int**. That won't work. Give it type int*:

void addtwo(int *arr){
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++){
        arr[i] = arr[i] + 2;
    }
}

Then, you need to pass the size in an additional argument. The problem is, that when you pass arrays, you really pass just a pointer (the compiler will make up a temporary pointer that points to the array's first element). So you need to keep track of the size yourself:

void addtwo(int *arr, int size){
    int i=0;
    for(;i<size;i++){
        arr[i] = arr[i] + 2;
    }
}


int main(void) {
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof myarray / sizeof myarray[0]);
}

Now it will work. Also put the return type before them. Some compilers may reject your code, since it doesn't comply to the most recent C Standard anymore, and has long been deprecated (omitting the return type was the way you coded with the old K&R C).

Upvotes: 7

dirkgently
dirkgently

Reputation: 111278

You need to pass a pointer to the first element of the array and the array size. Array types decay to pointers in the context of function parameters. Try:

void addtwo(int *arr, size_t size){
    for(size_t i = 0; i < size; i++){
        arr[i] = arr[i] + 2;
    }
}


int main() {
    int v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    addtwo(v, sizeof v / sizeof v[ 0 ]);
    return 0;
}

Upvotes: 0

Adam
Adam

Reputation: 786

In C a notation int *arr[] is the same as int** arr.

Upvotes: 1

Related Questions