user-0 提问: 请教C语言错误：0xC0000005: 写入位置 0x000000000559FD40 时发生访问冲突。

回复:
user: user-0
content: 引用 19 楼 DelphiGuy 的回复:largeaddressaware只是PE文件头的一个标志，可以使用VC++自带的editbin.exe设置或者去除，但是调用DLL的.exe也要设置/largeaddressaware:no，否则可能还会有问题。 更简单，也是比较偷懒的方法，是修改一下dword的定义： #if defined(_WIN64) || defined(_M_AMD64) typedef unsigned long long DWORD; #else typedef unsigned long DWORD; #endif 很棒！真的非常感谢！在大侠的帮助下问题解决了，还是修改指针类型的方式。修改dword定义的方式导致几个头文件的定义也出了问题，就没有深入修改。关闭大地址的方式由于对方需要此功能也没有尝试。再次感谢你的帮助，技术和人品都没得说，好人一生平安！ 也感谢其他朋友的热情指导，谢谢！  就此结贴~！

user: user-1
content: 百度搜相关关键字。

user: user-2
content: largeaddressaware只是PE文件头的一个标志，可以使用VC++自带的editbin.exe设置或者去除，但是调用DLL的.exe也要设置/largeaddressaware:no，否则可能还会有问题。 更简单，也是比较偷懒的方法，是修改一下dword的定义： #if defined(_WIN64) || defined(_M_AMD64) typedef unsigned long long DWORD; #else typedef unsigned long DWORD; #endif

user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-3
content: 个人认为是局部变量stream占用的内存空间过大导致，栈上的空间是有限的，不建议申请那么大的栈上空间。 建议改成1024再试试，改成1024或512对于你的这个程序也不会导致越界。

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: 引用 1 楼 Automation_dmu 的回复:((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 没看出溢出，哪里溢出了。 root只是一个指针，并且root指向了stream，这个数组可是65536个字节，不可能溢出的。

user: user-4
content: 肯定是越界的问题了，Win7 64没按道理也是越界，但是没崩溃 64位下比较sizeof(TRegion)和sizeof(TRoot)大小，看看是不是前者大于后者

user: user-0
content: 引用 17 楼 DelphiGuy 的回复:我测试了一下，在xp64、win7/64中，系统加载程序不会把64位应用加载到4GB以上地址空间，即便程序设置了largeaddressaware标志（32位编译器默认关闭，64位编译器默认打开），所以除非程序用到可能差不多4GB或者更多内存，64位指针截断为32位的问题不会暴露出来，但是win10/64会把有largeaddressaware标志的应用加载到4GB以上的随机地址，64位指针截断为32位的问题一下子就暴露出来了。可以链接时使用/largeaddressaware:no来关闭这一特性。 多谢多谢！动手试了真的很感谢！确实可以，程序运行没有报错，另外 改成：region=(PRegion)((BYTE *)root+BufferSeek); 的我也是了，也是没报错。非常感谢！但我改了之后现在遇到新的麻烦了。首先改成：region=(PRegion)((BYTE *)root+BufferSeek);的方式，牵扯太大了，改了其它的也要改，而且有的我还不知道怎么改（我贴出的只是出问题的部分代码）。再者通过设置/largeaddressaware:no，直接生成程序确实没问题，但我现在的任务是生成dll文件，供他人使用。编译的时候报了这个：1>LINK : warning LNK4075: 忽略“/LARGEADDRESSAWARE:NO”(由于“/DLL”规范)。然后写了个简单的程序调用它还是之前的错误（应该是大地址没有关成）。还望再帮我看看怎么样能关掉大地址选项。  在此也多谢以上回复的各位大侠！

user: user-5
content: region还是malloc一下

user: user-2
content: 我测试了一下，在xp64、win7/64中，系统加载程序不会把64位应用加载到4GB以上地址空间，即便程序设置了largeaddressaware标志（32位编译器默认关闭，64位编译器默认打开），所以除非程序用到可能差不多4GB或者更多内存，64位指针截断为32位的问题不会暴露出来，但是win10/64会把有largeaddressaware标志的应用加载到4GB以上的随机地址，64位指针截断为32位的问题一下子就暴露出来了。可以链接时使用/largeaddressaware:no来关闭这一特性。

user: user-3
content: 引用 14 楼 DelphiGuy 的回复:[quote=引用 11 楼 cfjtaishan 的回复:] [quote=引用 10 楼 DelphiGuy 的回复:] 可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的[/quote]  windows下64位编译器基本都使用LLP模型，long long是64位的，long仍然是32位的，输出sizeof(DWORD)就可以看到了，那篇文章中说的不全面，应该是针对unix类系统的编译器。  [/quote] 有可能的，不同系统下的编译规定也可能不一样

user: user-2
content: 呃，LLP64模型

user: user-2
content: 引用 11 楼 cfjtaishan 的回复:[quote=引用 10 楼 DelphiGuy 的回复:] 可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的[/quote]  windows下64位编译器基本都使用LLP模型，long long是64位的，long仍然是32位的，输出sizeof(DWORD)就可以看到了，那篇文章中说的不全面，应该是针对unix类系统的编译器。

user: user-6
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 1 楼 Automation_dmu 的回复:]     ((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 没看出溢出，哪里溢出了。 root只是一个指针，并且root指向了stream，这个数组可是65536个字节，不可能溢出的。[/quote]是的，我看错了

user: user-3
content: 引用 10 楼 DelphiGuy 的回复:可以改成：region=(PRegion)((BYTE *)root+BufferSeek); +++  但是在64位系统上，unsigned long(也就是DWORD）也是64位的。64系统是整体都提升为64位吧，比如int在64系统里编译器就是64位的

user: user-3
content: https://www.cnblogs.com/lovevivi/p/3334369.html 建议参考一下64位系统，不同类型的位数。

user: user-2
content: 这一句：region=(PRegion)((DWORD)root+BufferSeek);  编译为64位程序，root如果指向4GB以上地址，region将被截断到32位范围之内。

user: user-2
content: 可以改成：region=(PRegion)((BYTE *)root+BufferSeek);

user: user-0
content: 引用 1 楼 Automation_dmu 的回复:((PCustomAction)root)->index1=0;     ((PCustomAction)root)->index2=0;     ((PCustomAction)root)->index3=0;  溢出了 多谢回复！但疲敝掉错误仍旧。64位win7下却没报错，不知道什么原因