内存题目(自总).doc_第1页
内存题目(自总).doc_第2页
内存题目(自总).doc_第3页
内存题目(自总).doc_第4页
内存题目(自总).doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3 a34哪个不能表示 a11: *(&a00) *(*(a+1)+1) *(&a1+1) *(&a00+4) 4 for(int i.) for(int j.) printf(i,j); printf(j) 会出现什么问题 32 位机上根据下面的代码,问哪些说法是正确的?signed char a = 0xe0;unsigned int b = a;unsigned char c = a;A. a0 & c0 为真 B. a = c 为真 C. b 的十六进制表示是:0xffffffe0 D. 上面都不对分析:坑爹丫,有木有!10 个人 9 个这个恐怕都不敢确定!(敢肯定的要么是高手,要么就是错的!) B me 认为是错的,一个 uchar 和一个 schar 比较,真的就是一个字节在比较吗?C me 认为是对的,将一个 schar 赋值给一个 uint,要不要符号扩展呢?是绝对会还是可能会呢?细节到底是神马?O_OA 貌似比较确定,肯定是错的,肯定?揭露真相:A 确实是错的,B 也是错的,C 是对的,所以 D 也是错的。理由?A 错是因为,a 是负数,c 是正数,即使跟 0 比较要转换到 int(后面暂不区分转换和类型提升,总之就是类型变了),也是一负一正,所以 A 错。B 呢?是说一正一负不会相等,难道是因为这吗?难道不是吗?首先说 a 和 c 的二进制表示一模一样,都是 0xe0,那么比较就不相等?!是的,比较的时候全部转换为 int,所以呢,a 还是作为一个负数存在,c 作为一个正数存在,于是就不相等了,所以 B 错。C 肿么就对了?a 是一个 schar,赋值给 uint 的 b,前若干个字节不是补 0 吗?首先 schar 转换为 int,然后 int 转换成 uint,所以最初是符号扩展,然后一个 int 赋值给了 uint,C correct!me 曾经要写一篇关于c的类型以及指针的 blog,不过最后没有完成,不过还是可以参考一下的。下面哪些选项能编译通过?int i;char a10;string f();string g(string &str);A. if(!i)f(); B. g(f(); C. a=a+1; D. g(abc);分析:再次坑爹有木有!(其实 me 比较确信这道题,是坑别人的爹,O_O)A 绝对是正确的,C 绝对是错的,D 基本肯定是错的,那 B 呢?要么 error ,要嚒 warning!如果是 warning 但是没有 error ,这算神马情况呢?B 确实不应该选,至少语义上不该选!f() 返回一个临时量,然后传给 g 函数,而 g 的参数是非 const 引用,是不能引用临时量的!为嘛,如果 g 中修改了传进来的 string,那么会是怎么一回事呢?修改了一个临时量的值?那这意义何在呢?但是如果将 g 的原型修改为 string g(const string&); 就是可以的,为么可以?访问(只读)临时量就是正确的?那必须的,比如 u 可能想知道 a+b 的结果是多少,然后输出!a+b 的结果就是一个临时量。如果说修改 a+b 的结果,这是神马个逻辑?!真相:C 错是以为 a 是一个地址常量,不可能再被赋值。D 为嘛错呢?abc 的类型可是 const char* 呢,是个常量指针呢!(可以用来初始化 string。)int a10; 问下面哪些不可以表示 a1 的地址?A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)分析:奇葩丫!(其实并不奇葩!)腾讯的题目有时候出的的确有水平丫,虽然出的太有水平了分就考不高了。me 想哭丫,想来想去还是在 A 和 B 中选错了,%_%,当时还特意提醒自己来着的,O_Oc+ 中的 sort 如何用来排序 a 数组呢?sort(a, a+N); 或是 sort(a, a+sizeof(a)/sizeof(a0); 当时懵了,实际上 a+1,就是 a1 的地址呢!a 的类型是 int10,a+1 和一个 int* 类型的 +1 效果一样,都表示偏移 1 个元素,所以 A 不能表示。(选错误的!) C 能表示是因为取了首地址作为一个 int* 然后 +1,就是偏移一个元素,所以不选。B 肿么说呢,me 一直一位&a0 是一个普普通通的地址,+1 就是 +1个字节,实际上是 +1 个元素!D 也能表示?将 a 的首地址转换为一个 char* 指针,这个时候 +1 是偏移一个 char,也就是一个字节,实际上应该偏移 sizeof(int) 个字节才能到达 a1,所以 D 可以表示(不选)。不多说了。(如果是二维数组是不是会更懵呢,O_O)问下面的数据都存放在哪些存储区?int main() char *p = hello,world; return 0;A. . B. . C. 栈和常量区 D. 栈和堆分析:hello,world 是常量,赶脚应该就是 C 吧,应该大家感觉都一样。这里不涉及什么堆的事。假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?#include int main() long long a = 1, b = 2, c = 3; printf(%d %d %dn, a, b, c); return 0;A. . B. . C. . D. .分析:貌似问题没有想的那么简单。如果说运行结果,很简单,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和参数入栈的问题,me 表示现在有点无能为力,O_O下面哪些函数调用必须进入内核才能完成?A. fopen B. exit C. memcpy D. strlen分析:有些无能为力。A 是要打开文件的,貌似设计很多内核操作丫;exit 是退出进程,结束进程,应该也要深入内核。memcpy ,me 一直犹豫用户区的数据拷贝要不要通过内核。strlen me 感觉关系不大。内存管理中的 LRU 方法是用来管理神马的?A. 虚拟内存的分配 B. 虚拟内存的释放 C. 物理内存的分配 D. 物理内存的释放分析:貌似是用来关系物理块的,后面的填空题正好有说,O_O关于DMA 的说法,哪些是错误的?A. DMA,Direct Memory Acess 直接存储器访问,使得不同的速度的硬件设备可以直接通信,不通过 CPU 干预;B. DMA 访问的时候需要从 CPU 那里夺得总线控制权,然后.C. DMA 速度快;D. DMA 不需要中断控制,CPU 管理不要它;1)signed char a=0xe0;unsigned int b=a;unsigned char c=a;下面说法正确的是:A (a0 )&(b0)为真 B c=a 为真 C b的16进制为0xffffffe0 D 都不对/ 答案:C / 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C. 编程测试:printf (”%x %x %x,a,b,c);结果: ffffffe0 ffffffe0 e02)问下面的数据都存放在哪些存储区?int main() char *p = hello,world; return 0;解析:根据C语言中的特性和定义p是一个局部变量,而C语言中局部变量存在于栈中,hello wrold是一个字符串字面常量,因此存储于程序的只读存储区中,p在这里其实只是指向了hello wrold在只读存储区中的地址而已。3)关于 int a10; 问下面哪些不可以表示 a1 的地址?(A) A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)A. a+sizeof(int)解析:A. a+sizeof(int) / 不正确, 在32位机器上相当于指针运算 a + 4B. &a0+1 / 正确,数组首元素地址加1,根据指针运算就是a1的地址C. (int*)&a+1 / 正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思D. (int*)(char*)&a+sizeof(int)/ 正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为int*,显然是a1的地址 4)int main()long long a=1;long long b=2;long long c=3;printf(%d,%d,%d,a,b ,c);return 0;输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)解答:在32和64上面, long long都是8字节,printf(%d %d %dn, a, b, c);会依次从a的地址开始输出3个整型数据(4B)一共是12B,调用printf时参数从右至左压栈,压栈顺序是c,b,a且地址是连续存放的,小端情况下从a开始的栈去内存内容如下:0x 01 00 00 00 00 00 00 00 0x 02 00 00 00 00 00 00 00 0x 03 00 00 00 00 00 00 00所以连续输出12个字节的结果就是:1 0 25)下面哪些说法正确?(B) A. 数组和链表都可以随机访问 B. 数组的插入和删除可以 O(1) C. 哈希表没有办法做范围检查 D. 以上说法都不正确解析:数组可以直接通过下标得到存储的值 因此支持随机,访问链表是链式存储结构时无法支持随机访问,要访问一个指定位置的元素必须从头开始做指针移动。哈希表支持直接通过关键码得到值 其实数组就是一种哈希表 下标就是关键码 通过下标直接得到值 因此哈希表肯定需要做范围检查也有办法做范围检查的unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式处理器上变量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字节, 大端存储 ,补齐16进制表示为: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存储, 所以上述int a变量的最低地址存储的是 / 十六进制表示中最左边的1字节, 为0x00. 8)如下关于编译链接的说法错误的是()A) 编译优化会使得编译速度变慢B) 预编译头文件可以优化程序的性能C) 静态链接会使得可执行文件偏大D) 动态链接库会使进程启动速度偏慢9)如下关于链接的说法错误的是()A)一个静态库中不能包含两个同名全局函数的定义B)一个动态库中不能包含两个同名全局函数的定义C)如果两个静态库都包含一个同名全局函数,他们不能同时被链接D)如果两个动态库都包含一个同名全局函数,他们不能同时被链接4.在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是:A.只能在该cpp所在的编译模块中使用该变量B.该变量的值是不可改变的C.该变量不能在类的成员函数中引用D.这种变量只能是基本类型(如int,char)不能是C+类型Static全局变量和普通全局变量:针对:一个工程里有多个cpp文件时相同点:存储方式相同,都是静态存储;不同点:作用域不同。普通全局变量-作用域是整个源程序(含有多个源文件),在各个源文件中都有效Static全局变量-作用域是当前源文件5.观察下面一段代码:class ClassApublic:virtual ClassA();virtual void FunctionA();class ClassBpublic: virtual void FunctionB();class ClassC : public ClassA,public ClassBpublic:; ClassC aObject;ClassA* pA=&aObject;ClassB* pB=&aObject;ClassC* pC=&aObject;关于pA,pB,pC的取值,下面的描述中正确的是:A.pA,pB,pC的取值相同. B.pC=pA+pBC.pA和pB不相同 D.pC不等于pA也不等于pB6.参照1.5的代码,假设定义了ClassA* pA2,下面正确的代码是:A.pA2=static_cast(pB);B.void* pVoid=static_cast(pB); pA2=static_cast(pVoid);C.pA2=pB;D.pA2=static_cast(static_cast(pB);7.参照1.5的代码,下面那一个语句是不安全的: A.delete pA B.delete pB C.delete pC删除那个都有错误,编译是无错误,运行是有错误1 linux下调试core的命令,察看堆栈状态命令5 a34哪个不能表示 a11: *(&a00+5) *(*(a+1)+1) *(&a1+1) *(&a00+4)答案: *(&a1+1)a是数组的首地址,a1就表示a10地址了,不用再取地址了。6 fun(exp1,exp2),(exp3,exp4,exp5)有几个实参?答案:两个。形式参数:在声明和定义函数时,写在函数名后的括号中的参数。实参是调用参数中的变量,行参是被调用函数中的变量。10. *p=NULL *p=new char100 sizeof(p)各为多少?答案:都为4。因为都是指针类型,所占存储空间必然为4。/百度/5.下面结构体 struct s1 char ch, *ptr; union short a, b; unsigned int c:2, d:1; struct s1 *next; ; 的大小是_: A. 12字节 B.16字节 C.20字节 D. 24字节9.使用malloc系统调用分配的内存是在_ 上分配的? A 栈; B bss; C 物理内存; D 堆 1.(5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。 for (char *piterator = szWord; *piterator != 0; piterator+) if (*piterator & 0x80 != 0) piterator+; else if (*piterator = A & *piterator = Z) piterator += 32; 3. 代码void func()static int val;中,变量 val 的内存地址位于:A. 已初始化数据段 B.未初始化数据段 C.堆 D.栈6. short a100,sizeof(a) 返回?A. 2 B. 4 C. 100 D. 200 E. 4008. 以下代码打印的结果是(假设运行在 i386 系列计算机上):struct st_tint status;short *pdata;char errstr32;st_t st16;char *p = (char *)( st2.errstr + 32 );printf( %d, ( p - (char *)(st) ) );A. 32 B. 114 C. 120 D. 1112不定向选择3.以下的C程序代码片段运行后C和d的值分别是多少()Int a =1,b =2;Int c,d;C =(a&b)&a;d =(a&b)&a;A.0,0B.0,1C.1,0D.1,17. 内存的速度远远高于磁盘速度,所以为了解决这个矛盾,可以采用:A 并行技术 B 虚存技术 C 缓冲技术 D 通道技术3. 代码void func()static int val;中,变量 val 的内存地址位于:A. 已初始化数据段 B.未初始化数据段 C.堆 D.栈1. (5 分)重复多次 fclose 一个打开过一次的 FILE *fp 指针会有什么结果,并请解释。考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。3)unsigned int a= 0x1234;unsigned char b=*(unsigned char *)&a;在32位大端模式处理器上变量b=/ 答案:0 / unsigned int a= 0x1234; 其中int是4字节, 大端存储 ,补齐16进制表示为: 0x00 00 12 34 / unsigned char b=*(unsigned char *)&a; 由于大端存储, 所以上述int a变量的最低地址存储的是 / 十六进制表示中最左边的1字节, 为0x00. /华为/华为/华为/2.某32位系统下, C+程序,请计算sizeof 的值(5分).char str = “”char *p = str ;int n = 10;请计算sizeof (str ) = ?(1)sizeof ( p ) = ?(2)sizeof ( n ) = ?(3)void Foo ( char str100)请计算sizeof( str ) = ?(4)void *p = malloc( 100 );请计算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)413.C+中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理堆: 程序运行时动态申请,new 和malloc申请的内存就在堆上近堆还是远堆不是很清楚。19 关于内存对齐的问题以及sizof()的输出答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈。6.堆栈溢出一般是由什么原因导致的?没有回收垃圾资源。7.什么函数不能声明为虚函数?constructor函数不能声明为虚函数。15、如下定义,则s在内存中占多大空间?unionstructunsignedcharaa:4;unsignedcharab:4;a;unsignedcharc;unsignedchard;s;A) 1 byte B) 2byte C) 3byte D) 4byteA16、如下定义: uniontagAAAAstructcharucFirst;shortusSecond;charucThird;half_a;longlI;number;在按1字节对齐情况下,sizeof(union tagAAAA)的大小是: A 在按4字节对齐情况下,sizeof(union tagAAAA)的大小是: D A) 4byte B) 6byte C) 8byte D) 12byte17、0x12345678在采用BigEndian中内存的排列顺序是 A ,在采用LittleEndian内存中的排列顺序是 C 。(答案从左到右内存地址依次增加)A) 12 34 56 78 B) 34 12 78 56 C) 78 56 34 12 D) 56 78 12 3418、关于静态变量,下面说法“不正确”的有: A A) 静态变量在堆栈中分配B) 静态变量的作用域一定是局部的,例如在一个文件内或一个函数内C) 静态变量可分为静态局变量和静态全局部变量D) 静态变量存在于数据段中20、设有如下定义:int (*ptr)();则以下叙述中正确的是: C A) ptr 是指向一维数组的指针变量B) ptr是指向int型数据的指针变量C) ptr 是指向函数的指针,该函数返回一个int型数据D) ptr是一个函数名,该函数的返回值是指向int型数据的指针21、在Windows95环境下,定义数组:int *a24;则数组a所占用的内存单元为: D A)8字节 B) 32字节 C) 64字节 D)不确定. 关键字static的作用是什么?这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。Const 7关键字const有什么含意?我只要一听到被面试者说:const意味着常数,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着只读就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;/*/前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用:局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。4、队列和栈有什么区别? 队列先进先出,栈后进先出2Heap与stack的差别。Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数分配的内存空间即在堆上,C+中对应的是new操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行什么是预编译何时需要预编译:、总是使用不经常改动的大型代码体。 、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。char * const p;char const * pconst char *p上述三个有什么区别?char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *pchar str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;char *str7 = abc;char *str8 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) endl;结果是:0 0 1 1解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。12. 以下代码中的两个sizeof用法有问题吗?C易void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母 for( size_t i=0; isizeof(str)/sizeof(str0); +i ) if( a=stri & stri=z ) stri -= (a-A );char str = aBcDe;cout str字符长度为: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。一个32位的机器,该机器的指针是多少位指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。main()int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf(%d,%d,*(a+1),*(ptr-1);输出:2,5*(a+1)就是a1,*(ptr-1)就是a4,执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1); 则ptr实际是&(a5),也就是a+5原因如下:&a是数组指针,其类型为 int (*)5;而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a5但是prt与(&a+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a0的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5.1.请问以下代码有什么问题:int main()char a;char *str=&a;strcpy(str,hello);printf(str);return 0;没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。char* s=AAA;printf(%s,s);s0=B;printf(%s,s);有什么错?AAA是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosnt char* s=AAA;然后又因为是常量,所以对是s0的赋值操作是不合法的。1.有以下表达式:int a=248; b=4;int const c=21;const int *d=&a;int *const e=&b;int const *f const =&a;请问下列表达式哪些会被编译器禁止?为什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 这是个什么东东,禁止*d 说了是const, 禁止e = &a 说了是const 禁止const *f const =&a; 禁止2.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;有两种解法, 一种用算术算法, 一种用(异或)a = a + b;b = a - b;a = a - b; ora = ab;/ 只能对int,char.b = ab;a = ab;ora = b = a;3.c和c+中的struct有什么不同?c和c+中struct的主要区别是c中的struct不可以含有成员函数,而c+中的struct可以。c+中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private4.i nclude i nclude void getmemory(char *p) p=(char *) malloc(100); strcpy(p,hello world);int main( ) char *str=NULL; getmemory(str); printf(%s/n,str); free(str); return 0; 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险5.char szstr10;strcpy(szstr,0123456789);产生什么结果?为什么?长度不一样,会造成非法的OS8.类的静态成员和非静态成员有何区别?类的静态成员每个类只有一个,非静态成员每个对象一个9.纯虚函数如何定义?使用时应注意什么?virtual void f()=0;是接口,子类必须要实现1:(void *)ptr 和 (*(void*)ptr的结果是否相同?其中ptr为同一个指针.(void *)ptr 和 (*(void*)ptr值是相同的2:int main() int x=3; printf(%d,x); return 1; 问函数既然不会被其它函数调用,为什么要返回1?mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息1,要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?*(void (*)( )0x100000 ) ( );首先要将0x100000强制转换成函数指针,即:(void (*)()0x100000然后再调用它:*(void (*)()0x100000)();用typedef可以看得更直观些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)();unsigned short A = 10;printf(A = %un, A);char c=128; printf(c=%dn,c);输出多少?并分析过程第一题,A 0xfffffff5,int值 为11,但输出的是uint。所以输出4294967285第二题,c0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出128。这两道题都是在考察二进制向int或uint转换时的最高位处理。分析下面的程序:void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL; GetMemory(&str,100); strcpy(str,hello); free(str); if(str!=NULL) strcpy(str,world); printf(n str is %s,str); getchar(); 问输出结果是什么?希望大家能说说原因,先谢谢了输出str is world。free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。楼上都说过了,最好别这么干。char a10,strlen(a)为什么等于15?运行的结果i nclude stdio.hi nclude string.hvoid main()char aa10;printf(%d,strlen(aa);sizeof()和初不初始化,没有关系;strlen()和初始化有关。char (*str)20;/*str是一个数组指针,即指向数组的指针*/char *str20;/*str是一个指针数组,其元素为指针型数据*/long a=0x801010;a+5=?0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725罗1)给定结构struct A char t:4; char k:4; unsigned short i:8; unsigned long m;问sizeof(A) = ?给定结构struct A char t:4; 4位 char k:4; 4位 unsigned short i:8; 8位 unsigned

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论