c - For (*ptr)[], why is printf("%p",(void*)ptr+1) working but not printf("%p",ptr+1)? -


this question has answer here:

i fail understand error in following program.what have done i've assigned address of array of size 5 pointer ptr of type (*)[].there no type mismatch , it's ok far goes.but want print value ptr+1.as expected, shows error unspecified bounds.but misses me how same ptr+1 works fine when cast type void*.

casting fine, before comes that,how can program calculate ptr+1 doesn't know bounds? how know whether move 5 elements ahead, or 8 elements ahead or elements ahead?why doesn't (void*)ptr+1 show same error ptr+1?

to better highlight whole thing, have used pointer ctr explicitly declared of type (*)[5] instead of (*)[]. please give me technical reasons behind this.thank you.

#include<stdio.h>  int main(void) {  int ar1[5]={1,5,3,8,9};     int (*ptr)[]=&ar1,(*ctr)[5]=&ar1;     printf("%p\n",ptr+1);      //error unspecified bounds     printf("%p\n",(void*)ptr+1);    //it's ok     printf("%p\n",ctr+1);       //it's ok } 

psst!! last 2 correct printf()s don't produce same value.if comment out incorrect printf("%p\n",ptr+1); line, output.

0023ff25

0023ff38

psst!! checked again, int ptr+1 part of (void*)ptr+1 , 1 being added numeric value of ptr.what's going on?

please give me technical reasons behind this.

the technical reason when adding one, compiler tries jump next instance of type.

example: adding 1 int pointer increment four because int 4 bytes long , point next int.

in example, ptr never specified size. it's impossible jump next element because size of element not known. once specified size making point array of 5 elements, worked again.

when casting ptr void, became easy again go next element. compiler added 1 byte.

in run:

ptr 0023ff24

((void*)ptr) + 1 0023ff25 (the base address plus 1 byte 1 element of "void")

ctr 0023ff24 (same ptr)

ctr + 1 0023ff38 (the base address, plus 20 (5*sizeof(int)) bytes 1 element of int (*)[5])


Comments

Popular posts from this blog

linux - Does gcc have any options to add version info in ELF binary file? -

android - send complex objects as post php java -

charts - What graph/dashboard product is facebook using in Dashboard: PUE & WUE -