CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

weird behaviour of "size of"

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
ünloco



Joined: 02 Oct 2011
Posts: 12
Location: Tunisia

View user's profile Send private message Visit poster's website

weird behaviour of "size of"
PostPosted: Wed Nov 16, 2011 7:46 am     Reply with quote

hello
i have this array

Code:

int nums[10][6] = {
   {0x38,0x44,0x44,0x44,0x38,0x0}, //0
   {0x40,0x7C,0x0,0x0,0x0,0x0}, //1
   {0x4C,0x54,0x54,0x54,0x34,0x0}, //2
   {0x44,0x54,0x54,0x54,0x28,0x0}, //3
   {0x70,0x10,0x10,0x10,0x7C,0x0}, //4
   {0x74,0x54,0x54,0x54,0x48,0x0}, //5
   {0x38,0x54,0x54,0x54,0x8,0x0}, //6
   {0x40,0x40,0x4C,0x70,0x0,0x0}, //7
   {0x28,0x54,0x54,0x54,0x28,0x0}, //8
   {0x20,0x54,0x54,0x54,0x38,0x0} //9
};


when i use a variable that contains the index (n1) then "size of" gives me bad values !!

Code:
n1 = 2;
width = sizeof nums[2]; //gives width = 6 and that's ok
width = sizeof nums[n1]; //gives width = 2 !!!


what's wrong ??
_________________
for(;;);
RF_Developer



Joined: 07 Feb 2011
Posts: 839

View user's profile Send private message

PostPosted: Wed Nov 16, 2011 8:37 am     Reply with quote

Hmm... in C nums[0] is a pointer. Normally sizeof(a pointer) returns the size of the pointer, i.e. 2 in CCS generally. Using sizeof() with an array is a special case, and should the size of the array, not the the size of the pointer. C implements arrays with pointers remember and C arrays can be indexed or accessed through pointers interchangably. Note, if you had:

n1 = 2;

int *P = nums[2]; // P is now interchangable with nums[2].

then the following should happen:

width = sizeof nums[2]; //gives width = 6 and that's ok
width = sizeof nums[n1]; //gives width = 2 !!!
width = sizeof(P); // should be 2, i.e. sizeof(int *)

So, for some reason, CCS is interpreting sizeof(nums[2]) as the special case - tick VG - but sizeof(nums[n2]) as the normal, i.e. pointer case - not so good, must do better. The use of the variable is breaking the special case of sizeof for arrays... However the two are evaluated at very different times. sizeof(nums[2]) is in this case known at compile time, whereas sizeof(nums[n1]) has to be evaluated at run time. If nums[] was a ragged array, i.e. its elements not defined at compile time then sizeof(nums[2]) would also not be known at compile time. This makes sizeof() more tricky for compiler writers than we might at first expect.

RF Developer
Ttelmah



Joined: 11 Mar 2010
Posts: 19554

View user's profile Send private message

PostPosted: Wed Nov 16, 2011 8:41 am     Reply with quote

Sizeof, is computed at compile time, so trying to access an element indexed by a variable simply won't work. You get '2', because the compiler decides you want the storage size of the pointer to the row represented, and this (of course) is 2.

I see RF_Developer has pointed this out as well, while I'm typing.

Best Wishes
ünloco



Joined: 02 Oct 2011
Posts: 12
Location: Tunisia

View user's profile Send private message Visit poster's website

PostPosted: Wed Nov 16, 2011 1:59 pm     Reply with quote

thank you guys !
now it's clearer as to why
i'll avoid such use
greetz
_________________
for(;;);
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group