C语言内存分配详解15


   printf("%s/n",str);

   free(str);

   return 0;

  }

分析一下这段代码

  答案:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对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=(char *)malloc(num);

  }

  int main()

  {

char *str=NULL;

   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.

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《C语言内存分配详解15
本文地址:https://www.zhiletu.com/archives-659.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微