Tag Archives: C

小说const

const用法比较复杂,小结下我常见的用法。

  1. 限定类型修饰符。
    1. int const a = 1; //int型常量。需要在定义时就初始化。
    2.   

    3. int const arr[] = {1 ,2 , 3}; //数组中每一个元素都是常量。但是注意,不能把1中的a和arr[1]当作一样的。比如说可以紧接着这样定义:
      int testArr[a]; //正确
      int testArr[arr[1]]; //错误
      原因:const用于集合时,编译器不会把这个集合放到其符号表中,那么需要为其分配内存。但是虽然为其分配内存,其值却不能在编译阶段使用。
    4.   

    5. int const *p; //p是一个指向int型常量的指针。这里的p指针没必要在定义的时候就初始化。不过

Read More...

2009笔试+面试总结(一)

  十月份到现在参加了4个公司的笔试和面试,后天打算把三方协议签了,找工作就暂时尘埃落定了。开始专心复习之前,把笔试和面试中遇到的一些问题拿出来总结下。所列题目大致按照出题思想,非原题目。
  我面试的这4家IT公司,对于三点都非常重视。一个是基础知识,一个是运用知识,思考的能力,一个组织表达能力。按这三种分类记录下笔试和面试题目。

[基础知识]
  考察基础知识,在笔试题目最常见,占比例也最大。

  1. 有n个节点的二叉树,其中有m个节点有两个孩子,问这棵树有多少颗叶子节点。

    这题目其实是数据结构上的原题,不要被n迷惑了。

Read More...

基础…

  某题目:问下面的程序需要几次才能跳出循环?

        unsigned int a =1;
        int b = 0;
        while ( a+b >= 0){
            b--;
        }

  开始以为a会转换为int类型,这样循环只需要2次就结束了。测试程序后发现这是个死循环。今天看《The C Programming Language》,赫然发现”转换”一节中,提到了”整数提升”一词。规定:在一个表达式中,如果原始类型的所有值都可以用int类型表示,则其值将被转换为int类型,否则将被转换为unsigned int类型。

  我感觉很多时候我花了大把时间来搞明白,甚至以为…

Read More...

linux中使用命名管道实现客户端/服务器模型的进程间通信

  Linux下进程间通信主要有管道,消息队列,信号量,共享内存,套接口。这里主要说命名管道的一个应用:使用命名管道实现进程间Server/Client机制的通信.

  之所以去接触它,是因为实验室的项目中要求可信组和加密组可以进行通信。两者都在用户层,加密组向可信组发送请求,可信组返回响应。比如加密小组发送请求密钥信息,可信组返回所请求的密钥。由于传输的信息相对来说比较大,而且这两个程序逻辑上并不相关,所以在几种通信方式中我们选择了命名管道。

  命名管道其实是FIFO文件。在linux中终端下创建一个管道,用mkfifo命令:mkfifo fifoname;或者mknod命令:mknod fifo…

Read More...

linux中fork小结

fork函数在linux中非常重要,因为进程大多是通过它来创建的,比如linux系统在启动时首先创建了进程0,之后的很多进程借助do_fork得到创建.这两天在看匿名管道时了解了下fork,其应用毕竟广,这里只说些我才学到的吧.
首先来看例1.

#include "stdio.h" 
#include "unistd.h" 
#include "stdlib.h" 
 
int main(){
    int i;
    printf("hello world %d\n",getpid());
    i=

Read More...

linux内核模块之间通信

今天师兄问,linux内核模块之间如何进行通信?我才想起我之前也有这个疑问,只是当时不需要所以就没去关心了。晚上查了些资料,终于弄明白了些。
这里的通信可以简单点理解,就是模块B如何调用A的函数,变量或者常量。为了简化,我设计一个模块A中的一个函数为printMSG,原型为int printMSG(int n);传入的参数n表示打印几遍一个固定的字符串。模块A(在helloworld基础上修改的,所以名字都没变…懒)源码:

#include <linux /init.h> 
#include </linux><linux /module.h>  
int __init hel

Read More...

键盘钩子函数执行两次解决方法

考虑下面的键盘钩子函数。(MFC工程)

1
2
3
4
5
6
7
8
LRESULT CALLBACK KeyProc(int nCode,WPARAM w,LPARAM l){
	if('A'==w){
		MessageBox(NULL,"yes","test",MB_OK);
		return 1;
	}
 
	return 0;
}

也就是想在按下A的时候,弹出一个对话框。

然后在一个事件中添加:
SetWindowsHookEx(WH_KEYBOARD,KeyProc,NULL,GetCurrentThread…

Read More...