LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1067|回复: 13

malloc怎么都不理解 ?

[复制链接]
发表于 2004-8-20 21:02:54 | 显示全部楼层 |阅读模式
  1. [color=orange][SIZE=4]main()
  2. {
  3.   struct stu
  4.   {
  5.     int num;
  6.     char *name;
  7.     char sex;
  8.     float score;
  9.   } *ps;
  10.                                                                                 
  11.   [color=firebrick]ps=(struct stu*)malloc(sizeof(struct stu));[/color]
  12.   ps->num=102;
  13.   ps->name="Zhang ping";
  14.   ps->sex='M';
  15.   ps->score=62.5;
  16.   printf("Number=%d\nName=%s\n",ps->num,ps->name);
  17.   printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
  18.   free(ps);
  19. }[/size][/color]
复制代码



请问红色部分怎么理解 ?

ps = (struct stu*)malloc(sizeof(struct stu));
      这里什么意思       sizeof有什么作用,后面括号里又什么意思 ?


用??法: void *malloc(unsigned size);
看完我根本就透不上上面那例子,理解不了


这里还有另外一个例子
  1. pc=(char *)malloc(100);
  2. 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
复制代码


上边说的强制转换为字符数组类型,请问为什么要转换 ?
发表于 2004-8-20 21:27:11 | 显示全部楼层
[PHP]ps=(struct stu*)malloc(sizeof(struct stu));

sizeof(TYPE) 是得到一种类型的长度,
比如sizeof(struct stu)得到的就是stu这个结构体要占用多少个字节。
而malloc(sizeof(struct stu))则是分配一个大小为stu的大小的内存空间,
它返回一个指向这个空间的指针,这个指针为void*型。
所以要用struct stu*)强制转化为指向struct stu型的。[/PHP]
 楼主| 发表于 2004-8-20 21:37:22 | 显示全部楼层
后面理解malloc(sizeof(struct stu))

前面还是不理解,我参考了很多资料,都还是不理解,用法里说的却很简单,打扰你了,如果太麻烦你就不用回了,,,,还得谢谢你,,,!
发表于 2004-8-20 21:50:34 | 显示全部楼层
就你的程序来说吧,
malloc返回的是一个void型的指针,
它可以指向任何类型的数据,
而ps是struct stu型的指针,
于是我们就这把这个void型的用类型转换变为struct stu型的。
发表于 2004-8-20 22:33:31 | 显示全部楼层
ps = (struct stu*)malloc(sizeof(struct stu));

malloc分配sizeof(struct stu)字节(也就是stu结构的尺寸)的内存空间,并将指针赋给ps;(struct stu*)是类型修饰,说明是个指向stu结构的指针。
 楼主| 发表于 2004-8-21 01:47:59 | 显示全部楼层
sizeof(struct stu),sizeof是说明以struct stu也类型,malloc(sizeof(struct stu))是说明分一块以struct stu类型的内存单元出来 ?

我这样说对吗,,这里很好,,非常感谢你们,,
 楼主| 发表于 2004-8-21 01:58:18 | 显示全部楼层
  1. main()
  2. {
  3.   int i;
  4.   struct stu
  5.   {
  6.     int num;
  7.     char *name;
  8.     char sex;
  9.     float score;
  10.   } *ps;
  11.                        
  12.   for (i=1;i>0;i++)        {
  13.                                                          
  14.   ps=(struct stu*)malloc(sizeof(struct stu));
  15.   ps->num=102;
  16.   ps->name="Zhang ping";
  17.   ps->sex='M';
  18.   ps->score=62.5;
  19.   printf("Number=%d\nName=%s\n",ps->num,ps->name);
  20.   printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
  21.   //free(ps);  如果将这里禁止掉
  22.   }
  23. }
复制代码



这里添加个for,让它死循环下去,会不会将内存给站光了 ?

我运行了10分钟没死机, ??

ps=(struct stu*)malloc(sizeof(struct stu));这句每for一次,会不会多占用一次内存,因为后面没用free释放 ?


  ps=(struct stu*)malloc(100000000);

这里改成这样的话,运行一下子就变成Segmentation fault

我思想哪里出错了 ?? 高手请指出,,,谢谢你们
发表于 2004-8-21 02:10:33 | 显示全部楼层
sizeof是说struct stu的大小,
就是这样一个结构体类型要占用多少个字节的空间。
malloc则是分配这样大小的一个空间,并返回一个指向它的指针。
多看看书,

最初由 shell 发表
sizeof(struct stu),sizeof是说明以struct stu也类型,malloc(sizeof(struct stu))是说明分一块以struct stu类型的内存单元出来 ?

我这样说对吗,,这里很好,,非常感谢你们,,
发表于 2004-8-21 02:18:54 | 显示全部楼层
最初由 shell 发表

ps=(struct stu*)malloc(sizeof(struct stu));这句每for一次,会不会多占用一次内存,因为后面没用free释放 ?

应该不会死机的吧,
没有试过。
但当没有足够的内存来分配时malloc不会分配空间的,并返回NULL;

如果没有free掉,内存占用是会越来越多的。
  
  ps=(struct stu*)malloc(100000000);

这里改成这样的话,运行一下子就变成Segmentation fault

我思想哪里出错了 ?? 高手请指出,,,谢谢你们

看一下你的100000000是多少,100M,不知道malloc有没有上限的,
上限是多少?
偶不知道,请高手回答 ,:p :p
发表于 2004-8-21 09:21:06 | 显示全部楼层
malloc是有上限的。不会允许你无限大地分配内存。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表