黑马程序员技术交流社区

标题: [入学交流] C语言面试题__指针篇(4) [打印本页]

作者: CesC    时间: 2015-7-24 23:35
标题: [入学交流] C语言面试题__指针篇(4)
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一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。

作者: llo    时间: 2015-7-25 21:23
66666666666666666666666666666666
作者: wxh794708907    时间: 2015-7-31 23:11
赞一个 感觉看不懂还有一些 爱爱 还要好好看笔记了
作者: 黑夜一无所有    时间: 2015-7-31 23:22
顶起值得一看
作者: Anne_lov    时间: 2015-8-1 10:04
你面试的时候就是面试的这些题吗?
作者: 我丶就这样    时间: 2015-8-1 10:29
不错   学习了
作者: wy911011    时间: 2015-8-1 11:05
面试几道题啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2