c语言内存不能为written,执行时,该内存不能为"read"求指导

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

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

17573368.png

我机子的操作系统是 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;

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

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

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

17573370.gif

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

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

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

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

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

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

17573370.gif

就是上面说的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;

}

17573371.png

这就是你的依据?我很惊讶。你知道吗,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的实现标准什么的。

17573370.gif

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

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

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

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

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

C11标准的PDF,n1570

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值