Re: is this correct C? (char*)spm += spm->partitionMapLength;



On Nov 30, 3:50 pm, O_TEXT <O_T...@xxxxxxxxx> wrote:
Spiros Bousbouras a écrit :

On Nov 30, 1:00 pm, O_TEXT <O_T...@xxxxxxxxx> wrote:
is line 11 valid?
if yes, is it equivalent to line 10?

1 typedef unsigned char uint8_t;
2 struct sparablePartitionMap
3 {
4 uint8_t partitionMapLength;
5 } __attribute__ ((packed));
6 void initialise(char *devicename)
7 {
8 struct sparablePartitionMap *spm;
9 spm += spm->partitionMapLength;
10 spm = ( struct sparablePartitionMap *) ((char*)spm +

spm->partitionMapLength);
11 (char*)spm += spm->partitionMapLength;
12 }
No , line 11 is not valid C because the expression
(char *)spm is not an lvalue.

gcc 4.1 gives this error message (not a lvalue).

I do not the requirment for a value to be a lvalue.

You're missing a verb here.

gcc answers no:

./a.out
spm : 0x2b3e202a8ca0
spm : 0x2b3e202a8ca5
spm : 0x2b3e202a8ccd

int main()
{
long *spm;
printf ("spm : %p \n", spm );
spm = ( long *) ((char*)spm + 5);
printf ("spm : %p \n", spm );
spm += 5;
printf ("spm : %p \n", spm );
return 0;
}

This also evokes undefined behaviour so it
doesn't tell us much.
.



Relevant Pages