| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | | | |
| 公告 |
|
| Blog信息 |
|
blog名称:FoxWolf 日志总数:127 评论数量:246 留言数量:0 访问次数:858878 建立时间:2006年5月31日 |

| |
|
[必须掌握]C语言之extern声明辨析 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/8 15:05:43 |
1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。
2 问题:extern 变量
在一个源文件里定义了一个数组:
char a[6]; 在另外一个文件里用下列语句进行了声明:
extern char *a; 请问, |
|
|
[必须掌握]Linux Programming by Example:The Fundamentals(Notes One) 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/7 14:21:57 |
|
3.1 Linux/Unix 地址空间
众所周知,操作系统把一个可执行的程序载入内存中,这个可执行程序可称为一个进程。操作系统为程序访问命令行和环境变量做好准备,将程序开启运行。分配进程的内存可分为以下五个区域:
①代码段 (文本段-text segment)
可执行指令放在这个区域。如果可能,Linux/Unix会安排好相同程序的多个运行实体共享这些实例代码。任何内存只有一份相同程序的指令拷贝。可执行文件中包含文本段的部分叫文本结点(text section)。
②数据段 (data segment)
初始化为非零值的静态分配数据和全局数据存放在数据段中。运行相同程序的每个进程都有自己的数据段。可执行文件中包含数据段的部分是数据结点(data section)。
③BSS 段(Block Started by Symbol)
缺省初始化为零的全局数据和静态分配的数据存放在进程的BSS区域。每个运行相同程序的进程都有自己的BSS区域。当程序运行的时候,把 |
|
|
[必须掌握]进程在内存中的影像 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 16:49:26 |
进程在内存中的影像.
我们假设现在有一个程序, 它的函数调用顺序如下.
main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...)
即: 主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3
当程序被操作系统调入内存运行, 其相对应的进程在内存中的影像如下图所示.
&nbs |
|
|
[必须掌握]C语言高效编程的四大绝招 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 10:42:14 |
编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。
第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:
方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!");
方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 ;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要 |
|
|
[必须掌握]#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 10:40:55 |
#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
上述宏是什么意思?
计算 STRUCTURE 类型中 FIELD 域的偏移量
下面拿KEIL 8051的定义来作点解释: ((s *)0):强制转化成数据结构指针,并使其指向地址0; ((s *)0)->m:使该指针指向成员m &(((s *)0)->m):获取该成员m的地址 (size_t)&(((s *)0)->m):转化这个地址为合适的类型 你可能会迷惑,这样强制转换后的结构指针怎么可以用来访问结构体字段?呵呵,其实这个表达式根本没有也不打算访问m字段。ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m) |
|
|
[必须掌握]BSS段 数据段 代码段 堆栈 文章收藏, 软件技术
FoxWolf 发表于 2007/11/5 10:37:30 |
BSS段 数据段 代码段 堆栈 声明:大部分来自于维基百科,自由的百科全书。
BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:在采用段式内存管理的架构中,代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许自修改程序。 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆栈又称堆栈(stack)在计算机科学中,是一种特殊的链表形式的数据结构,它的特殊之处在于只能允许在链表的一端(称为栈顶,英文为top) |
|
|
[必须掌握]static的作用 文章收藏, 网上资源, 软件技术, 电脑与网络
FoxWolf 发表于 2007/10/6 13:47:11 |
| 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容 | |
|
[必须掌握]朴素的模式匹配和改进的模式匹配(KMP)算法 网上资源, 软件技术
FoxWolf 发表于 2007/7/25 0:48:40 |
朴素的模式匹配和改进的模式匹配(KMP)算法说明 LEWISLAU 前言:最近复习数据结构,以前老师讲的时候居然忽略了串。汗,我们学校的确牛B。某仁兄告诉我,KMP基本是数据结构里面难度比较大的算法了,所以掌握了它,至少从心理上给我了很大的鼓舞,但是这个算法是我询问老师才掌握的,呵呵。言规正传,开始说KMP算法。 在说改进的模式匹配(KMP)算法之前我们先说朴素的模式匹配: 其实很简单,就是两个字符串逐位比较。在模式匹配中:我们假定字符串P在字符串T中查找是否有匹配的。此时,称P为模式(Pattern)字符串,称T为目标(Target)字符串。 OK,我一般比较喜欢以实例说明问题。 T: a b d a b d a b c P: a b&n |
|
|