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; 禁止 ------------------------------------------
9. #include <stdio.h> #include <stdlib.h>
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操作很危险 博主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char *) malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针void getmemory(char **p),这样malloc返回的地址付给*p(即str变量本身)。 -----------------------------------------
10. char szstr[10]; strcpy(szstr,"0123456789"); 产生什么结果?为什么?
答案:长度不一样,会造成非法的OS ------------------------------------------
11.要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
答案:*((void (*)( ))0x100000 ) ( ); 首先要将0x100000强制转换成函数指针,即: (void (*)())0x100000 然后再调用它: *((void (*)())0x100000)(); 用typedef可以看得更直观些: typedef void(*)() voidFuncPtr; *((voidFuncPtr)0x100000)(); ------------------------------------------
12. 分析下面的程序:
void GetMemory(char **p,int num) { //p,指向指针的指针,*p,p指向的指针(即str),**p,最终的对象,str指向的单元 *p=(char *)malloc(num); //申请空间首地址付给传入的被p指向的指针,即str }
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); 软件开发网 www.mscto.com getchar(); }
问输出结果是什么?
答案:输出str is world。
free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL. 此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。 -------------------------------------------
13.char a[10]; strlen(a)为什么等于15?
#include "stdio.h" #include "string.h"
void main() { char aa[10]; printf("%d",strlen(aa));
}
答案:sizeof()和初不初始化,没有关系; strlen()和初始化有关。 --------------------------------------------
14.char (*str)[20];/*str是一个数组指针,即指向数组的指针.*/ char *str[20];/*str是一个指针数组,其元素为指针型数据.*/ ---------------------------------------------
15. #include<iostream.h> #include <string.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> |