Abhishek Sagar
Abhishek Sagar

Reputation: 1326

How to access the individual elements of the array through array pointer?

#include <stdio.h>
void
foo (int (*ptr)[10]) {
(*ptr[0])++;
(*ptr[1])++;
(*ptr[4])++;
}

int
main(int argc, char **argv) {
int i;
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foo(&arr);
for (i = 0; i < 10; i++) {
    printf ("%d ", arr[i]);
}
printf ("\n");
return 0;
}

vm@ubuntu:~/src/tcpip_stack$ gcc test.c

vm@ubuntu:~/src/tcpip_stack$ ./a.out

2 2 3 4 5 6 7 8 9 10

*** stack smashing detected ***: terminated

Aborted (core dumped)

How to access the individual elements of the array through array pointer in foo ( ) ? Here it seems like, in foo() , based on array index, the entire array is being jumped as many times as index value.

Upvotes: 2

Views: 49

Answers (1)

Ted Lyngmo
Ted Lyngmo

Reputation: 117318

You dereference ptr incorrectly so you instead access non-existing int[10]s (out of bounds).

Corrected:

void foo(int (*ptr)[10]) {
    (*ptr)[0]++;
    (*ptr)[1]++;
    (*ptr)[4]++;
}

This is in accordance with operator precedence which says that ptr[0] means the first int[10] (which is ok), ptr[1] means the second int[10] and ptr[4] means the fifth int[10], which you then dereference and try to increase the first element in. You must first dereference ptr ((*ptr)), then use the subscript operator.

Precedence Operator Description Associativity
1 ++
[]
Post increment
Array subscripting
Left-to-right
2 * Dereference Right-to-left

This means that your code is equivalent to

void foo(int (*ptr)[10]) {
    (*(ptr[0]))++; // increase the first element in the first (only) int[10]
    (*(ptr[1]))++; // undefined behavior
    (*(ptr[4]))++; // undefined behavior
}

Upvotes: 2

Related Questions