Thanks for your reply Dan. In my case, I am explicitly creating an array of 
bytes and if I have enough space in the array, why should there be an issue 
with copying an integer to the array even if the memory address is not 
aligned? For e.g., I have an array of 10 bytes, I copy one byte to the 
array and after that, copy an int (4 bytes). I would expect Emscripten to 
allow me to do the copying as long as I have enough capacity in the array.

What is more puzzling is that this works on my Mac machine but just not on 
Emscripten. Is there a reason for this difference in behaviour? I could use 
memcpy but just want to spend a little more time to understand this issue.

On Tuesday, October 28, 2014 10:58:30 PM UTC+8, Dan Gohman wrote:
>
> Hello, 
>
> Yes, an address is "aligned" when the numeric value of the address is a 
> multiple of some value. In your case, the code is storing an int, which 
> requires an alignment of 4 on most platforms. Most of the time, the 
> compiler and library will automatically allocate things at suitable 
> addresses for you so you don't have to worry about alignment. But, when you 
> take an arbitrary char* value and cast it to int*, the C language says that 
> it's your responsibility to make sure the pointer value is a multiple of 
> the required alignment value (4, here). 
>
> Loading or storing with an address that is not suitably aligned for the 
> type of the access triggers what the C language calls "undefined behavior". 
> It may do what you expect sometimes, but C compilers sometimes find clever 
> ways of optimizing using the assumption that all accesses are through 
> aligned pointers. When they do this, it can cause the program to misbehave 
> on unaligned pointers, so it's wise to avoid giving them the chance to 
> cause trouble. It's the same situation under Emscripten, except that 
> Emscripten *always* does something clever. 
>
> The typical way to fix this bug in your code is to use memcpy, since 
> memcpy has no alignment requirement: 
>
>   memcpy(_bos, &val, sizeof(int)); 
>
> Dan 
>
> ----- Original Message ----- 
> > Hi, 
> > 
> > I was trying to assign an integer value to an array of unsigned char 
> when I 
> > encountered an alignment error on SAFE_HEAP. The code is as follows: 
> > 
> > *((int*)(_bos) = val; 
> > 
> > where val is of type integer and _bos is of type unsigned char*. I am 
> just 
> > curious as to why there is an alignment error when _bos is 1 byte in 
> length 
> > and an integer is 4 bytes. Is it because the memory allocated to _bos is 
> > not big enough or not in multiples of 4? 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "emscripten-discuss" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to [email protected] <javascript:>. 
> > For more options, visit https://groups.google.com/d/optout. 
> > 
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to