Date: Tue, 3 Sep 2013 14:31:11 +0200 From: Michael Tuexen <tuexen@freebsd.org> To: freebsd-arm@freebsd.org Subject: A simple question about C... Message-ID: <DA4B80F8-E42F-4230-BD45-929CE92F1098@freebsd.org>
next in thread | raw e-mail | index | archive | help
Dear all,
I'm trying to get a C program (packetdrill) running FreeBSD r254973
on a Raspberry Pi.
Since tests are failing, I wrote the little C program:
#include <stdint.h>
#include <stdio.h>
#include <string.h>
int
main(void)
{
uint8_t byte[] =3D {0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b};
uint32_t i, n, *p;
for (i =3D 0; i <=3D 8; i++) {
p =3D (uint32_t *)(byte + i);
memcpy(&n, byte + i, sizeof(uint32_t));
printf("p =3D %p, *p =3D %08x, n =3D %08x.\n", (void =
*)p, *p, n);
}
return (0);
}
It produces the following output:
p =3D 0xbfffec48, *p =3D 03020100, n =3D 03020100.
p =3D 0xbfffec49, *p =3D 00030201, n =3D 04030201.
p =3D 0xbfffec4a, *p =3D 01000302, n =3D 05040302.
p =3D 0xbfffec4b, *p =3D 02010003, n =3D 06050403.
p =3D 0xbfffec4c, *p =3D 07060504, n =3D 07060504.
p =3D 0xbfffec4d, *p =3D 04070605, n =3D 08070605.
p =3D 0xbfffec4e, *p =3D 05040706, n =3D 09080706.
p =3D 0xbfffec4f, *p =3D 06050407, n =3D 0a090807.
p =3D 0xbfffec50, *p =3D 0b0a0908, n =3D 0b0a0908.
So everything is fine when reading the 4 byte long uint32_t on a 4-byte =
aligned
address. Results are strange (at least for me), when the address is not =
4-byte
aligned. There is no difference between clang and gcc. Can I only =
dereference
properly aligned pointers? Is the above expected or is it a bug in the =
compiler?
Best regards
Michael=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?DA4B80F8-E42F-4230-BD45-929CE92F1098>
