Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: [lpc2000] For C Experts

2006-03-30 by Robert Adsett

Quoting dsidlauskas1 <dsidlauskas@...>:

> Consider the following code:
>
> ============================
> char buf[]={1,2,3,4,5,6,7,8};
> int *ip, x[4];
>
> for (i=0; i<4; i++)
>    {
>    ip = (int *)&buf[i];
>    x[4]  = *ip;
>    }
> =============================
> The Keil compiler compiles this without warning, but does not produce
> the expected (for me) result in x. The problem is that Keil uses the
> LDR instruction to effect the transfer and this is valid only on 4
> byte boundaries.
>
> GCC compiles but does give a non-aligned access warning.
>
> I believe that the compiler has enough information to use byte aligned
> transfers, and should, or at least give a warning.
>
> Anybody want to weigh in on this one.

The short answer is that the code is broken.  The only semi-portable way to do
this is memcpy.

There is no requirement to provide a warning in this case AFAIK.  That's a
quality of implementation issue.

Robert

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.