文章关键字 ‘C语言’

你可以分配多大的内存?

2010年12月7日,星期二

《C专家编程》中的一个程序,觉得挺有意思,记录一下。

运行下列程序,看看在你的进程中可以分配多大的内存。

#include <stdio.h>
#include <stdlib.h>
main() {
    int Mb = 0;
    while ( malloc(1<<20)) ++Mb;
    printf("Allocated %d Mb total\n", Mb);
}

总共分配的内存量取决于交换区和你的系统配置中的进程限制。如果实际分配的内存块小于1M字节,你实际得到的内存是否比这要多一些?为什么?

为了让这个程序能够在有内存限制的MS-DOS上运行,把每次分配的单元从1MB改为1KB(就是把1<<20改为1<<10,并用KB代替MB)。

在我的系统物理内存为2GB,可以分配的内存大概是1880MB,你的系统呢?

另,在Windows系统中把1<<20改为1<<10会有很神奇的事情发生哦~

C语言中的字符串常量

2010年11月30日,星期二

说起字符串常量,学过C语言的人都不陌生。字符串常量的书写方式是一对双引号包围一串字符,如:

"Hello, world"

当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所储存的地址,而不是这些字符本身。因此,你可以把字符串常量赋值给一个“指向字符的指针”,后者指向这些字符所储存的地址,如:

char *str = "Hello, world";

但是,你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。简单的说,字符串常量的值是这些字符在内存中的地址。

现在考虑下面一段代码:

if("Demon")
    printf("true");
else
    printf("false");

你认为会输出什么,true or false?

TCC,很小很强大

2010年11月28日,星期日

一直喜欢用很小很强大的软件,如uTorrent、EditPlus、WinRAR、UltraISO、VbsEdit等等,TCC也是其中的一员。

说起TCC就不得不提到TC,因为它们的缩写很像。TC是Turbo C的缩写,是Borland公司开发的DOS环境下的C语言集成开发环境,Borland公司的传奇就是从TC开始的。DOS时代已成为过去,Borland传奇也已成为历史,但是国内仍然有很多C语言教材里用TC作为编译器,谭浩强的烂书《C语言程序设计》就是其中的一本。

TCC是Tiny C Compiler的缩写,传说是目前最小的ANSI C语言编译器,支持Windows和Linux平台。Windows下的TCC解压后文件夹仅932KB,连1000KB都不到。Ubuntu系统可以通过apt-get install tcc命令来安装。你可以使用这个不到1000K的编译器编译你的C源码,它支持C的预处理,编译,机器码汇编和链接。编译速度也超过了GCC,而且它支持ISO C99标准,并且还包括了一些内存和数组边界的检查。它甚至还可以编译Linux的内核。

不仅TCC本身很小,而且TCC编译出来的程序也很小。用一个简单的Hello world程序就可以比较出来:

#include <stdio.h>
int main()
{
    printf("Hello, world\n");
    return 0;
}
  • 用BCC 5.5编译得到的程序是51.0 KB (52,224 bytes)
  • 用VC 6.0编译得到的程序是40.0 KB (40,960 bytes)
  • 用TCC 0.9.25编译得到的程序是1.50 KB (1,536 bytes)

编译出来的程序的大小几乎可以和汇编语言写的相媲美,实乃编译病毒代码的最佳选择。很小很强大,不是么?

C语言中size_t的陷阱

2010年11月26日,星期五

今天写了一个类似这样的程序:

#include <stdio.h>
#include <string.h>
int main()
{
    int i = -1;
    if(i > strlen("Demon"))
        printf("Hello World");
    else
        printf("Hello Demon");
    return 0;
}

输出的竟然是Hello World!-1 > 5?!

仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:

typedef unsigned int size_t;

即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。

今后遇到有符号数和无符号数之间的运算时要千万小心。

隐藏系统托盘图标的小程序TrayHider

2010年10月15日,星期五

前几天有人问怎么隐藏程序的系统托盘图标,于是研究了一下,写了个小程序,虽然不知道为什么要隐藏系统托盘图标。

  • 仅支持32位系统,不支持64位
  • 双击左栏图标就可以隐藏对应的程序系统托盘图标
  • 热键Ctrl + Alt + D可以隐藏/显示程序主窗口
  • 支持命令行参数,如TrayHider.exe  QQ.exe隐藏QQ的托盘图标

参考链接:

  1. Вопросик .. для наших Win32 гуру
  2. Shell Tray Info – Arrange your system tray icons
  3. 隐藏Windows系统托盘图标(改进版)