A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。

6 个回复

正序浏览
面试几道题啊?
回复 使用道具 举报
不错   学习了
回复 使用道具 举报
你面试的时候就是面试的这些题吗?
回复 使用道具 举报
顶起值得一看
回复 使用道具 举报
赞一个 感觉看不懂还有一些 爱爱 还要好好看笔记了
回复 使用道具 举报
66666666666666666666666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马