 |
堆和栈的区别
|
|
| |
| 一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5、程序代码区—存放函数体的二进制代码。二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1267次,回复0次 |
|
|
 |
程序员陷阱题
|
|
| |
| 程序员陷阱题本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1050次,回复0次 |
|
|
 |
以下代码有什么问题?
|
|
| |
| cout << (true?1:"1") << endl;答:三元表达式“?:”问号后面的两个操作数必须为同一类型。本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1056次,回复0次 |
|
|
 |
C/C++笔试小结
|
|
| |
| 1.void *p=malloc(100);sizeof(p)=4;---------------------指针的字节数,而不是指针指向的内容容量2. void Func(char str[100]){sizeof(str)=4;}--------------------数组作为函数的参数进行传递时,该数组自动退化为同类型的指针3.char str[100];sizeof(str)=100;--------------------不是函数的参数时4.char str[]="hello";char *p=str;int n=10;sizeof(str)=6;sizeof(p)=4;sizeof(n)=2;--------------------参考上面的5.#define A 3#define B 4#define C A+B#define s(x) x*xs(c)=A+B*A+B=3+4*3+4=19;-------------------宏展开只是简单的字符串替换6.一组碰到最多的题,至少4次笔试的题都有它,搞得我郁闷啊可参见林锐的《C/C++高质量编程》,很详细的解答了下面的题(1)void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);} void Test(void){ ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1400次,回复0次 |
|
|
 |
Linux守护进程的编程方法
|
|
| |
| 其实守护进程编程也没有什么难的,你只要掌握了一般的步骤就行了,而且 以后就可以将原来的那些程序块照搬过来。 下面是一篇文章,我想已经说得很清楚了,你自己好好看看吧。 ----守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且 周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd ,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程 crond,打印进程lpd等。 ----守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相 同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬 某些书上的规则(特别是BSD4.3和低版本的SystemV)到Linux会出现错误的。下 面将全面介绍Linux下守护进程的编程要点并给出详细实例。 ----一.守护进程及其特性 ----守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与 之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭 的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些 环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守 护进程的启动方式有其特殊之处。它可以 ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1266次,回复0次 |
|
|
 |
基础理论的笔试真题,常考
|
|
| |
| 1. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域2. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的指针。3. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性4. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈5. 什么是平衡二叉树?左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于16. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源7. 什么函数不能声明为虚函数?constructor8. 冒泡排序算法的时间复杂度是什么?O(n^2)9. 写出float x 与“零值”比较的if语句。if(x>0.000001&&x<-0.000001)10. Internet采用哪种网络协议?该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层11. Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析?f?h)12.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上 ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1194次,回复0次 |
|
|
 |
如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
|
|
| |
| 答案:#ifdef __cplusplus cout<<"c++";#else cout<<"c";#endif本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1711次,回复0次 |
|
|
 |
c/ c++基本概念总结,笔试必考
|
|
| |
| static用法小结 static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register(谭浩强, 第174-175页)与auto类型(普通)局部变量相比, static局部变量有三点不同1. 存储空间分配不同auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)特点: static局部变量的”记忆性”与生存期的”全局性”所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的 ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1798次,回复0次 |
|
|
 |
文件中有一组整数,要求排序后输出到另一个文件中
|
|
| |
| 答案:#i nclude<iostream>#i nclude<fstream>using namespace std;void Order(vector<int>& data) //bubble sort{ int count = data.size() ; int tag = false ; // 设置是否需要继续冒泡的标志位 for ( int i = 0 ; i < count ; i++) { for ( int j = 0 ; j < count - i - 1 ; j++) { if ( data[j] > data[j+1]) { tag = true ; int temp = data[j] ; data[j] = data[j+1] ; data[j+1] = temp ; } } if ( !tag ) break ; }}void main( void ){ vector<int>data; ifstream in("c:\\data.txt"); if ( !in) ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1227次,回复0次 |
|
|
 |
以下三条输出语句分别输出什么?
|
|
| |
| char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc";const char* str6 = "abc";cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?cout << boolalpha << ( str5==str6 ) << endl; // 输出什么? 答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1281次,回复0次 |
|
|
 |
linux中string库函数的实现,笔试时常考
|
|
| |
| /** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions should generally be found* as inline code in <asm-xx/string.h>** These are buggy as well..** * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>* - Added strsep() which will replace strtok() soon (because strsep() is* reentrant and should be faster). Use only strsep() in new code, please.** * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,* Matthew Hawkins <matt@mh.dropbear.id.au>* - Kissed strtok() goodbye*/#include <linux/types.h>#inc ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1670次,回复0次 |
|
|
 |
编写字符串拷备函数
|
|
| |
| har *strcpy(char *strDest, const char *strSrc){ if ( strDest == NULL || strSrc == NULL) return NULL ; if ( strDest == strSrc) return strDest ; char *tempptr = strDest ; while( (*strDest++ = *strSrc++) != ‘\0’); return tempptr ;}本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1044次,回复0次 |
|
|
 |
#include<file.h> 与#include
|
|
| |
| 答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1115次,回复0次 |
|
|
 |
C++中的空类,默认产生哪些类成员函数?
|
|
| |
| 答:class Empty{ public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const};本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读2018次,回复0次 |
|
|
 |
以下代码能够编译通过吗,为什么?
|
|
| |
| unsigned int const size1 = 2;char str1[ size1 ];unsigned int temp = 0;cin >> temp;unsigned int const size2 = temp;char str2[ size2 ];答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1105次,回复0次 |
|
|
 |
请说出const与#define 相比,有何优点?
|
|
| |
| 答案:1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1219次,回复0次 |
|
|
 |
简述数组与指针的区别?
|
|
| |
| 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a[] = “hello”;a[0] = ‘X’;char *p = “world”; // 注意p 指向常量字符串p[0] = ‘X’; // 编译器不能发现该错误,运行时错误(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a[] = "hello world";char *p = a;cout<< sizeof(a) << endl; // 12 字节cout<< sizeof(p) << endl; // 4 字节计算数组和指针的内存容量void Func(char a[100]){cout<< sizeof(a) << endl; // 4 字节而不是100 字节}本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1457次,回复0次 |
|
|
 |
C++的特性
|
|
| |
| C++新增加有重载(overload),内联(inline),Const,Virtual四种机制重载和内联:即可用于全局函数,也可用于类的成员函数;Const和Virtual:只可用于类的成员函数;重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。覆盖是指派生类函数覆盖基类函数函数名相同;参数相同;基类函数必须有Virtual关键字;不同的范围(派生类和基类)。隐藏是指派生类屏蔽了基类的同名函数相同1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。1、 参数做输入用的指针型参数,加上const可防止被意外改动。2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:将void Func(A a) 改为v ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读984次,回复0次 |
|
|
 |
extern“C”有什么作用?
|
|
| |
| Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读2039次,回复0次 |
|
|
 |
构造函数与析构函数
|
|
| |
| 派生类的构造函数应在初始化表里调用基类的构造函数;派生类和基类的析构函数应加Virtual关键字。不要小看构造函数和析构函数,其实编起来还是不容易。#include <iostream.h>class Base{ public: virtual ~Base() { cout<< "~Base" << endl ; }};class Derived : public Base{ public: virtual ~Derived() { cout<< "~Derived" << endl ; }};void main(void){ Base * pB = new Derived; // upcast delete pB;}输出结果为: ~Derived ~Base如果析构函数不为虚,那么输出结果为 ~Base本文转载自IT网it求职笔试真题库网。
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1134次,回复0次 |
|
|