user1695758
user1695758

Reputation: 173

Why Does This Kind of Pointer Arithmetic Work In A Function, But Not In Main?

Here is my code that works. The function initializes the array, a, to values 0 - 3

int main(void) 
{
    int a[4];

    pointer(a);

    return 0;
}

void pointer(int* a)
{
   int *p, i;
   p = a;

   for(i = 0; i < 4; i++)
   {
       *a++ = i;
       printf(" %d", p[i]);
    }
}

But when I combine it all into main(), it no longer works.

int main(void) 
{
    int a[4], *p, i;
    p = a;

    for(i = 0; i < 4; i++)
    {
        *a++ = i;
        printf("%d", p[i]);
    }

    return 0;
}

Instead, it prints out memory addresses or something. It works when I dynamically allocate a[], so I'm guessing it has something to do with the way a[] is managed in memory. Can someone tell me why the second main() doesn't work?

Upvotes: 1

Views: 288

Answers (5)

KARTHIK BHAT
KARTHIK BHAT

Reputation: 1420

In functions you'r passing the array address point to a pointer. and pointer is accessing each variable when u increment it. this is called a walking pointer. but in case when u use it in main you'r assuming that array is a simple . Think of an array declared by compiler like

int *const array;

so when you try to increment it. it pops an error. so use one more Walking pointer inside main so u traverse the array

Upvotes: 0

Nibnat
Nibnat

Reputation: 119

you should know the differences between array and pointer.I suggest . In function,the array you put in will turn to pointer(point to first element of array),it's a variable of pointer,so you can do increasement,in main,a is a address of first element,it's constant,so you can't change.you should change pointer p.

Upvotes: 0

jbgs
jbgs

Reputation: 2885

C arrays decay into pointers in some circunstances, but they aren't pointers. Use p instead of a.

It works when you dynamically allocate a because malloc() returns a pointer, not an array.

Upvotes: 1

mpontillo
mpontillo

Reputation: 13947

I can't even compile your code, and the error illustrates why:

$ gcc -o foo foo.c
./foo.c:9:11: error: cannot increment value of type 'int [4]'
        *a++ = i;
         ~^
1 error generated.

You aren't actually using a pointer in your code at all. If you change it as follows, it works as you expect:

#include <stdio.h>

int main(void) 
{
    int a[4], i;
    int* p = a;

    for(i = 0; i < 4; i++)
    {
        *p++ = i;
        printf("%d", a[i]);
    }

    return 0;
}

Upvotes: 4

Yu Hao
Yu Hao

Reputation: 122493

In the function pointer, the argument a is a pointer. But in main, a is an array, you can't modify an array name, so *a++ = i is invalid.

Upvotes: 4

Related Questions