`
waret
  • 浏览: 132274 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论
文章列表
Windows的消息系统是由3个部分组成的:   • 消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取消息,然后分派给某个窗口。   • 消息循环。通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。   • 窗口过程。每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后响应它。窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给Wi ndows。注意回调函数是程序中的一种函数,它是由Windows或外部模块调用的。 一个消息从产生到 ...
1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam,lParam),当窗口收到消息时系统就会调用此窗口过程来处理消息。( ...
1 )内存泄露 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2)   缓冲栈溢出 指程序中栈所申请的空间大于系统剩余的空间时就会发生缓冲栈溢出的错误。
int main() { char *a="Hello"; char *b="world\n"; strcpy(a,b); printf("%s,%s",a,b); } 程序运行的结果是什么? 解析:这道题看上去很简单,实际上不简单。 第一想到的就是strcpy的地址越界问题,所以认为结果可能是: world world 或者是运行错误,因为出现了地址越界,对于越界后的地址我们并不知道存的是什么,有可能是很重要的内容。 第二想到的是\n在结果中怎么输出呢,这个问题考虑的多余,\\n才是输 ...
union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小,如: typedef union { char c[10]; char cc1; }u11; typedef union { char c[10]; int i; }u22; typedef union { char c[10]; double d; }u33; sizeof(u11)结果:   VC按照sizeof(c)分配空间为10;G++按照sizeof(c)分配空间为10。 sizeof(u22)结果:   VC按照sizeof(int)*3 ...
void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 运行Test函数后,程序崩溃。 因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。     char *GetM ...
#include <stdlib.h> int fn1(void); void _onexit( fn1 ); // 或: #include <stdlib.h> int atexit( void(*function)(void));  
    接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认 ...
    所位数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍,DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽,x86 CPU能直接访问对齐的数据,当他试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。同样一段代码,我们来看看用VC、Dev-C++和lcc三个不同编译器编译出来的程序的执行结果: #include <stdio.h> int main() { int a; char b; int c; p ...
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区, static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放。 4、文字常量区 — 常量字符串就是放在 ...
    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: Example::Example() : ival(0), dval(0.0) { //ival 和dval是类的两个数据成员 }     上面的例子 ...
int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr)); // 8, 8 解答: 1. int arr[]={6,7,8,9,10}; int *ptr=arr;//现在ptr指向6 *(ptr++)+=123;//现在ptr指向7,第一个元素变为129 printf("%d,%d",*ptr,*(++ptr)); //考虑从右往左计算 ...
overload (重载)和 override(覆盖)的不同体现在以下方面:         (1)重载的几个函数必须在同一个类中;覆盖的函数必须在有继承关系的不同的类中。 (2)覆盖的几个函数必须函数名、参数、返回值都相同;     重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。 (3)覆盖的函数前必须加关键字Virtual。
    C++支持两种初始化变量的形式:复制初始化(copy-initialization)和直接初始化(direct-initialization)。     复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中。   int ival(1024); //direct-initialization int ival = 1024; //copy-initialization, //此时如果是为类对象赋值,则实际上调用的是复制构造函数  
用户抢占:     内核即将返回用户空间的时候,如果need resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。在内核返回用户空间的时候,它知道自己是安全的。所以,内核无论是在从中断处理程序还是在系统调用后返回,都会检查need resched标志。如果它被设置了,那么,内核会选择一个其他(更合适的)进程投入运行。     注意:当进程执行系统调用时,就会从执行状态转换为就绪状态。 内核抢占(可抢占式内核):     即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。 非抢占式内核: ...
Global site tag (gtag.js) - Google Analytics