我使用以下代码在过去一年中使用他们的编译器从Xilinx ARM Linux中的地址空间读取,并且它已经工作(如编译时没有错误并产生预期结果):
void *ctl_ptr = mmap(NULL,Length , PROT_READ|PROT_WRITE, MAP_SHARED, fd, ctl_addr);
// Read Status
int status = *((unsigned *)(ctl_ptr + C_FIFO_ISR));
// Clear Interrupts
*((unsigned *)(ctl_ptr + C_FIFO_ISR)) = 0xffffff;
今天提到的一位同事,这段代码甚至不能正常工作,因为它是无效指针算法。现在我很困惑,为什么它一直在工作?
这是一个void指针算术的例子(它看起来像是这样),如果是这样,它为什么会起作用?
更多信息:
我一直在使用Xilinx SDK 2014.1,这是包含上述内容的文件的编译结果:
19:09:55 **** Auto Build of configuration Debug for project ZynqPSPLTest ****
make all
Building file: ../src/ZynqPSPLTest.c
Invoking: ARM Linux gcc compiler
arm-xilinx-linux-gnueabi-gcc -Wall -O0 -g3 -c -fmessage-length=0 -MMD -MP -MF"src/ZynqPSPLTest.d" -MT"src/ZynqPSPLTest.d" -o "src/ZynqPSPLTest.o" "../src/ZynqPSPLTest.c"
Finished building: ../src/ZynqPSPLTest.c
Building target: ZynqPSPLTest.elf
Invoking: ARM Linux gcc linker
arm-xilinx-linux-gnueabi-gcc -o "ZynqPSPLTest.elf" ./src/ZynqPSPLTest.o
Finished building target: ZynqPSPLTest.elf
make --no-print-directory post-build
Copy Elf to share
cp /media/work/stacey/zynq_eval/EvalDebug/sdk/ZynqPSPLTest/Debug/ZynqPSPLTest.elf /home/stacey/build_share
Invoking: ARM Linux Print Size
arm-xilinx-linux-gnueabi-size ZynqPSPLTest.elf |tee "ZynqPSPLTest.elf.size"
text data bss dec hex filename
11339 328 4 11671 2d97 ZynqPSPLTest.elf
Finished building: ZynqPSPLTest.elf.size
19:09:56 Build Finished (took 720ms)
这是版本输出:
[stacey@centos6 bin]$ ./arm-xilinx-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-xilinx-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/media/work/Xilinx/SDK/2014.1/gnu/arm/lin/bin/../libexec/gcc/arm-xilinx-linux-gnueabi/4.8.1/lto-wrapper
Target: arm-xilinx-linux-gnueabi
Configured with: /scratch/janisjo/build7/2013.11-xilinx-linux-respin1/src/gcc-4.8-2013.11/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-xilinx-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch=armv5te --with-arch=armv7-a --with-cpu=cortex-a9 --with-float=softfp --with-fpu=neon-fp16 --disable-multilib --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2013 -D__CS_SOURCERYGXX_MIN__=11 -D__CS_SOURCERYGXX_REV__=53' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2013.11-53' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-xilinx-linux-gnueabi/libc --with-build-sysroot=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/libc --with-gmp=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-isl=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-cloog=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libssp --enable-poison-system-directories --with-build-time-tools=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/bin --with-build-time-tools=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/bin SED=sed
Thread model: posix
gcc version 4.8.1 (Sourcery CodeBench Lite 2013.11-53)
答案 0 :(得分:1)
C:\Program Files\NetBeans 8.0.2\java\maven
有extension允许无效指针算术,请参阅the documentation: Arithmetic on void- and Function-Pointers:
在GNU C中,支持加法和减法操作 指向void和指向函数的指针。这是通过 将空白或函数的大小视为1。
这样做的结果是sizeof也允许在void和on上 函数类型,并返回1。
如果这些扩展名为-Wpointer-arith选项请求警告 使用
答案 1 :(得分:1)
最初的C编译器(Unix v 6,c.1975)也是这样做的。它忽略了void
并将指针视为一个数字。或者另一种看待它的方式是,它将void *
视为与char *
相同。
原始的c编译器也正确地执行了更高级别的指针对象。它必须,以便索引struct {int a, b;} mystruct [20]
按预期工作。