我正在尝试编译和运行下面的代码片段,它在 Windows x86 或 WOW64 中工作,但在 Windows x64 中,他因访问冲突错误而崩溃。
使用 gcc 和 Microsoft C/C++ 编译器进行编译。
/*Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
(x64)cl -W3 -Zi tx.c -Fetx64
(x86)cl -W3 -Zi tx.c -Fetx32
gcc (tdm64-1) 4.7.1
(x64)gcc -m64 -Wall -O2 -o tx64 tx.c
(x86)gcc -m32 -Wall -O2 -o tx32 tx.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int (*fpPUTS)( const char *str ); /*function pointer that takes an const char * as an argument and returns int*/
typedef void (*fpMEMEXEC)( fpPUTS pPuts, char *str ) ;/*function pointer on which first argument is pointer to above function*/
void toMem( fpPUTS pPuts, char *str )
{
pPuts( str );
}
int main(int argc, char* argv[])
{
fpMEMEXEC pMemexec;
pMemexec = (fpMEMEXEC) malloc(4*1024);/* Allocate 4 KB memory space to the function pointer */
memcpy( pMemexec, toMem, 4*1024); /* Copy the content of toMem into newly allocated memory */
pMemexec( puts, "Hello word !!\n"); /* execute it in memory */
return 0;
}
我的问题是,为什么这段代码在 64 位环境下不能正常工作?
哪些规则没有得到满足,但应该是为了让这段代码正常工作?