执行时,该内存不能为"read",求指点!

用API写了个窗口,用VC++6.0 编译 连接 都无错误,但是运行时候出错,程序运行不出来。弹出如下报错信息:

我机子的操作系统是 WindowsXP Pro SP3

程序的代码如下:

#include

LONG WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpszCmdLine,int nCmdShow)

{

WNDCLASS wc;

HWND hwnd;

MSG msg;

wc.style=0;                                      //class style

wc.lpfnWndProc=(WNDPROC)WndProc;                 //Window procedure address

wc.cbClsExtra = 0;                               //Class extra bytes

wc.cbWndExtra = 0;                               //Window extra bytes

wc.hInstance = hInstance;                        //Instance handle

wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);           //Icon handle

wc.hCursor = LoadCursor(NULL,IDC_ARROW);         //Cursor handle

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);     //Background color

wc.lpszClassName = "MyWndClass";                 //WNDCLASS name

RegisterClass(&wc);

hwnd = CreateWindow(

"MyWndClass",                               //WNDCLASS name

"SDK Application",                          //Window title

WS_OVERLAPPEDWINDOW,                        //Window style

CW_USEDEFAULT,                              //Horizontal position

CW_USEDEFAULT,                              //Vertical position

CW_USEDEFAULT,                              //Initial width

CW_USEDEFAULT,                              //Initial height

HWND_DESKTOP,                               //Handle of parent window

NULL,                                       //Menu handle

hInstance,                                  //Application's instance handle

NULL                                        //Window-creation data

);

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

while (GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

switch(message)

{

case WM_PAINT:

hdc  = BeginPaint(hwnd,&ps);

Ellipse(hdc,0,0,200,100);

EndPaint(hwnd,&ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd,message,wParam,lParam);

}

求教大侠,哪儿出错了?

------解决思路----------------------

哪个指针(局部变量的)没有初始化,自己找找。

------解决思路----------------------

下面是VC debug下,常见的几个内存问题

0xcdcdcdcd - Created but not initialized

0xdddddddd - Deleted

0xfeeefeee - Freed memory set by NT's heap manager

0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ

0xabababab - Memory following a block allocated by LocalAlloc()

------解决思路----------------------

定义窗口类的时候差一个窗口菜单的定义,wc又是局部变量所以初始值不确定,加一个wc.lpszMenuName=NULL;

------解决思路----------------------

问题解决分析思路

找本Win32手册 查找出错的位置的函数RegisterClass

描述函数功能:该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。

返回值:如果函数成功,返回值是唯一标识已注册的类的一个原子;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数

之后你需要灵感 RegisterClassEx 这个函数 发现不会崩溃,也许这就是为什么出现扩展的一部分原因。

之后你调用GetLastError(); 发现返回值是87 之后你会百度ERROR_INVALID_PARAMETER,可能某个参数不合法

之后你会找个合法的参数进行对比

WNDCLASS wndcls;

wndcls.cbClsExtra=0;

wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

wndcls.hInstance=hInstance;

wndcls.lpfnWndProc=NULL;

wndcls.lpszClassName="Weixin2003";

wndcls.lpszMenuName=NULL;

wndcls.style=CS_HREDRAW

------解决思路----------------------

CS_VREDRAW;*/

很容易得出 wc.lpszMenuName=NULL; 没有设置 导致的 之后你会去了解为什么会这样 不设置就报错了呢

之后 之后 之后 。。。。。。

------解决思路----------------------

WNDCLASS wc = {0};  是用于初始化结构体的,   按顺序初始化, 如果个数不足时会全部填写0.

所以 ={0}, 实际就相当于 memset(&wc, 0, sizeof(wc)); 了.

------解决思路----------------------

wc.lpszClassName = "MyWndClass";

在这一行下面加上一句

wc.lpszMenuName = "mymenu";

然后就可以运行了

原因是你没有初始化menu,而这在win窗口初始化看来是必须的

------解决思路----------------------

如果人你不想设置菜单名的话,

有两种解决办法

1,像楼上说的,置为null

2,在结构体初始化的时候

memset(&wc,0,sizeof(wc));

楼主你试试看

总之,结构体使用前最好初始化一下,习惯

------解决思路----------------------

引用:Quote: 引用:定义窗口类的时候差一个窗口菜单的定义,wc又是局部变量所以初始值不确定,加一个wc.lpszMenuName=NULL;

套用星爷电影里的一句台词:我对你的佩服犹如滔滔江水,连绵不绝……

加一个wc.lpszMenuName=NULL;立马就OK了。

有人刚跟我说,把wc初始化:WNDCLASS wc = {0};这样也OK。wc作为WNDCLASS类的一个对象,里面有很多成员,这么初始化,我感觉很怪。不过,那么做也OK。能告诉我怎么回事吗?//我现在刚学MFC,技术很菜

就是上面说的wc是局部变量,初始值不确定,如果你不给它赋值谁知道它里面是什么奇奇怪怪的东西,于是就报错了(理论上人品爆表是可以不报错的)。WNDCLASS wc = {0}是申请变量时就就把他初始化(相当于int i=0;类似的),这样wc里面的所有成员都赋值为0了。

------解决思路----------------------

引用:Quote: 引用:Quote: 引用:Quote: 引用:Quote: 引用:Quote: 引用:Quote: 引用:定义窗口类的时候差一个窗口菜单的定义,wc又是局部变量所以初始值不确定,加一个wc.lpszMenuName=NULL;

套用星爷电影里的一句台词:我对你的佩服犹如滔滔江水,连绵不绝……

加一个wc.lpszMenuName=NULL;立马就OK了。

有人刚跟我说,把wc初始化:WNDCLASS wc = {0};这样也OK。wc作为WNDCLASS类的一个对象,里面有很多成员,这么初始化,我感觉很怪。不过,那么做也OK。能告诉我怎么回事吗?//我现在刚学MFC,技术很菜

就是上面说的wc是局部变量,初始值不确定,如果你不给它赋值谁知道它里面是什么奇奇怪怪的东西,于是就报错了(理论上人品爆表是可以不报错的)。WNDCLASS wc = {0}是申请变量时就就把他初始化(相当于int i=0;类似的),这样wc里面的所有成员都赋值为0了。

struct T {char a, b, c, d, e;} t = {0};

这样,结构的所有成员都是0了?

你的依据呢,小朋友?

int main()

{

struct T

{

int a,b,c;

} t1={0},t2;

cout<

cout<

return 0;

}

这就是你的依据?我很惊讶。你知道吗,C的实现有符合标准的,也有不符合标准的,还有没跟上标准的。好吧确实不知道,这个写法是我不知道在哪看的,不过一直在用而且很好用的样子。

哈哈哈,你应该坚持自己的观点,不要被我恶意地左右自己的想法。如果觉得自己正确,要找资料为自己辩护。

其次你是对的。

N1570--- Committee Draft — April 12, 2011 ISO/IEC 9899:201x

6.7.9 Initialization

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.If an object that has static or thread storage duration is not initialized explicitly, then:

— if it has pointer type, it is initialized to a null pointer;

— if it has arithmetic type, it is initialized to (positive or unsigned) zero;

— if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;

— if it is a union, the first named member is initialized (recursively) according to these

rules, and any padding is initialized to zero bits;

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

------解决思路----------------------

其实我想说我真的不知道C的实现标准什么的。

另,我看了我刚才的解释觉得写的有点误导楼主,

wc={xxx};是将wc的第一个成员赋值为xxx,后面的成员没有给出要付的值,就默认赋值为0了。

所以wc={2};不是将每一个成员都赋值为2,是只将第一个成员赋值为2,后面的都是0.

------解决思路----------------------

C99标准的pdf,网上多得很;

C11标准的PDF,n1570

但C11没有正式官方文本的PDF

c语言内存不能为written,执行时,该内存不能为read求指导相关推荐

  1. 承载(Host)通用语言执行时

    承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...

  2. c语言在main函数中结束,C语言程序执行时,必须从main函数开始,从mian函数结束。...

    C语言程序执行时,必须从main函数开始,从mian函数结束. 甲在上班途中遗失手机一部,语言程被乙拾得.甲发布悬赏广告称,语言程愿向归还手机者支付现金1000元作为酬谢.根据物权法律制度的规定,下列 ...

  3. 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )

    文章目录 一.变量概念 二.变量本质 1.变量本质 - 内存别名 2.变量存储位置 - 代码区 3.变量三要素 一.变量概念 变量概念 : 变量 是 既能读 , 又能写 的 内存对象 ; 与 变量 相 ...

  4. c 多文件全局变量_必须知道的C语言知识细节:C程序编译后内存到底是如何布局...

    「今天是学习C语言第 116 天」 当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch C语言程序编译以后,代码和数据都必须存放在内存中由CPU执行.理解C程序内存是 ...

  5. python中正确的输入语句x、y=input_语句x=input()执行时,如果从键盘输入12并按回车键,则x的值是( )。_学小易找答案...

    [多选题]听障儿童辨音训练包括( ) [简答题]实现栈类(顺序栈跟链栈均可),并利用栈实现十进制到二进制的转换. 将源代码.py文件作为附件上传. [简答题]什么是空字典和空集合?如何创建 [简答题] ...

  6. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. Android执行时ART载入OAT文件的过程分析

    在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...

  8. 微软的Framework导致该内存不能为written或read的错误?

    这阵子运行VS经常出现如下错误: "0x0381fd60" 指令引用的"0x0381fd60"内存.该内存不能为"written". 一番& ...

  9. 该内存不能为written或read的解决方案

    运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭.  "0x????????"指令引用的"0x????????"内存.该内存不能为"re ...

最新文章

  1. swift 4.0 创建tableview 自定义cell
  2. strcpy、memcpy和memset的区别
  3. ssas如何创建分区_如何基于SSAS信息创建Excel报告
  4. c#app.config配置文件使用
  5. python之路 -- 并发编程之进程
  6. 对anaconda虚拟环境进行迁移
  7. 可计算行与计算复杂性多带图灵机实例
  8. 13个绚丽的Jquery 界面设计
  9. 雅可比矩阵(Jacobian)、海森矩阵(Hessian)
  10. python批量打印word_Python操作Word批量生成文章的方法
  11. 墨刀 - 简单 易用的APP原型设计工具
  12. 在子页面控制父页面iframe的高度
  13. [转]XXX无法访问。你可能没有权限使用网络资源
  14. Access时间日期比较查询的方法总结
  15. 语雀文章导入CSDN
  16. 制作App,免编程积木式搭建如此之简单
  17. C++序列容器之 vector常见用法总结
  18. Ubuntu 18.04安装GPGPU-Sim,运行ispass-2009 benchmarks
  19. Java调用第三方http接口 单点登录 HttpClient
  20. (01)ORB-SLAM2源码无死角解析-(24) 单目SFM地图初始化→CreateInitialMapMonocular()-细节分析:尺度不确定性

热门文章

  1. 关于org.apache.ibatis.type.JdbcType的解决方案
  2. 马甲包4.3混淆方案
  3. 培训班出身的前端,出路在哪儿
  4. 视频教程-2020年软考信息安全工程师_基础知识精讲软考视频培训课程-软考
  5. BZOJ 2820 YY的GCD(莫比乌斯反演)
  6. JAVA 中魔法数字定义
  7. 警惕Approve授权骗局
  8. 正则表达式-匹配中英文、字母和数字,手机号,电话号码, 身份证,邮编
  9. Unity之生成扫描二维码
  10. 你和高级工程师的差距在哪儿?