Windows上x86程序正常但x64程序崩溃问题

先看下面代码:

#include <stdio.h>
#include <windows.h>
#include <memory>

class Test
{
public:
    Test(int i)
        :a(i)
    {
    }

    ~Test()
    {
    }

public:
    void Print()
    {
        printf("a=%d\n", a);
    }

private:
    int a;
};

int main()
{
    std::shared_ptr<Test> aa(new Test(6));
    aa->Print();

    wprintf(L"Test* size: %d\n", sizeof(Test*));
    wprintf(L"ULONG size: %d\n", sizeof(ULONG));
    ULONG data = (ULONGLONG)aa.get();
    ((Test*)data)->Print();
}

x86环境下,运行正常(输出如下):

a=6
Test* size: 4
ULONG size: 4
a=6

但如果编译x64的程序后运行,这里就有问题了:

a=6

Test* size: 8
ULONG size: 4

----------------------------> Crash.

 

这里其实从打印出的size来看,很明显这两个size不一致导致, 指针在x64位环境下为8字节,而在x86环境下只有4字节(通常)。

因此如果程序要想同时可以在x86及x64环境下运行,需要考虑这一点。

时间: 2024-10-08 19:44:01

Windows上x86程序正常但x64程序崩溃问题的相关文章

如何实现在Windows上运行Linux程序,附示例代码

如何实现在Windows上运行Linux程序,附示例代码 微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理,而今天的这篇文章将会讲解如何自己实现一个简单的原生Linux程序运行器, 这个运行器在用户层实现, 原理和Bash On Windows不完全一样,比较接近Linux上的Wine. 示例程序完整的代码在github上, 地址是 https://github.com/30324

关于C#编写x86与x64程序的分析

电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系统,不能够很充分的利用这台机器的资源.x86程序,即适用于32为操作系统的程序,x64即适用于64位操作系统的程序.64位系统上依然可以运行32位的程序,但是这是通过WOW64来运行,通俗上讲,就是模拟出一个32位的CPU来运行这个程序. 接下来是C#程序的编译运行,分为两步,第一步是编译成IL,在

利用smba实现windows上写程序,linux上运行

1.在linux下载程序代码(确保获取正确的文件属性) 2.在windows编写代码,对于已有代码,不改变文件权限,如原先为755的,更改文件内容后依然是755的文件,如果要新建文件,默认为644,其它权限,需在linux中用chmod设置 3.更改完成直接在windows上传,上传到服务器的文件权限与linux上传相一致. 第1点没什么奇怪,windows上用git下载代码后会使得文件权限丢失 对于第2点,需要smba中进行设置,其中要把/etc/samba/smb.conf中这几行取消注释就

关于如何删除windows上的顽固程序

举例说明吧 现在机器上有一个hello.exe的程序怎么也删除不掉,而且到任务管理器里面,发现其在运行,但是任务管理器结束该进程后,hello.exe又自动运行(不管什么机制),结果是你还是删不掉hello.exe 到底是谁启动了hello.exe我们不关心,反正肯定是保护程序,那我们如何在保护程序启动hello.exe前就删掉他呢,那就是下面脚本能做的事情了: 前提找到正在运行的hello.exe的进程id值然后运行如下内容的hello.bat文件即可 del -f hello.exe kil

Qt程序在Windows上发布

最近写好了一个Qt5的小程序,并且已经配置好了所有的依赖库,需要发布. 这个主要是讲发布的 查找依赖库请看我的另一篇博客 Qt的程序在其他电脑上使用 http://blog.csdn.net/homechao/article/details/9113531 因为所有的文件比较大约70M左右,直接复制比较慢,也容易丢失文件 在网上看了很多使用第三方的软件进行打包,倒也是可以使用就是比较麻烦点 其实Windows上都已经有现成的打包软件啦,大家可能天天用,都没想到吧 那就是RAR,用起来非常简单,我

如何在Windows上安装FFmpeg程序

如何在Windows上安装FFmpeg程序 由 Yutao 编辑 2 方法:下载FFmpeg在命令行中开启FFmpeg FFmpeg程序进行各种媒体格式的转换,从而它们可以在不同设备上播放.该程序只有命令行模式,因此将它安装到计算机中看上去有些令人生畏,但是只要根据本指南的方法,你只需要几分钟就可以将FFmpeg安装成功! 广告 方法 1: 下载FFmpeg 1 下载FFmpeg.访问下载页面时,你将看到很多不同下载选项.你可以根据自己的操作系统选择下载最新的32位或64位静态程序版本.广告 2

Hadoop-mapreduce 程序在windows上执行需要注意的问题

1.在主程序中需要添加这几个参数配置 Configuration conf = new Configuration(); // 1.设置job运行时要访问的默认文件系统 conf.set("fs.defaultFS", HADOOP_ROOT_PATH); // 2.设置job提交到哪去运行 conf.set("yarn.resourcemanager.hostname", "hadoop1"); conf.set("mapreduce

Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)

原文:Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新) 程序如何自己更新自己呢?你可能会想到启动一个新的程序或者脚本来更新自己.然而 Windows 操作系统允许一个应用程序在运行期间修改自己的名称甚至移动自己到另一个文件夹中.利用这一点,我们可以很简单直接地做程序的 OTA 自动更新. 本文将介绍示例程序运行期间改名并解释其原理. 本文内容 在程序运行期间手工改名 不止是 exe 文件,dll 文件也是可以改名的 为什么 Windows 上的可执行程序可以在运行

将socket程序从linux移植到windows上

今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用VC自定义的宏(比如SOCKET.SOCKADDR等等)感觉代码重合量挺大的. 比如最简单的TCP客户端和服务端对话,在VC中用int取代SOCKET宏,用struct sockaddr_in取代SOCKADDR_IN宏. 然后区别就仅仅是头文件和windows额外加载/关闭套接字库的代码了. // Unix/Linux#include <sys/socket.h> #include <netinet/in.h>