工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 5617|回复: 43

有关calloc的使用

[复制链接]
发表于 2006-6-17 23:34 | 显示全部楼层 |阅读模式
近来学了calloc,请问它在实际使用中怎么调用?例如分配一块内存空间用来存取10个双精度数,是不是在主函数中直接输入:void*calloc(10,4)????????
麻烦结合实例跟我说说它的使用,谢谢!
发表于 2006-6-17 23:48 | 显示全部楼层
calloc malloc都是返回指针的:

    void *指针是一种未定义指针 可以转换成任何类型的指针

  1.      main()
  2.       {
  3.            int *p;
  4.            p=(int *)malloc(sizeof(int));
  5.       }
复制代码


alloc返回的是一块内存空间的首地址(实际上,用malloc也可以做到)
回复

使用道具 举报

 楼主| 发表于 2006-6-18 00:01 | 显示全部楼层
这我知道,课本是这样说的.但我想知道的是它的详细使用方法。能不能举多一些例子我看看,例子越详细越好。再次感谢!
回复

使用道具 举报

发表于 2006-6-18 00:09 | 显示全部楼层
楼上还没有学到数据结构吧?
数据结构中的动态链表就要用到了(在C++用new)。你搜索下,会有例子的。
回复

使用道具 举报

发表于 2006-6-18 01:00 | 显示全部楼层
举个简单的应用:

  1. #include <stdio.h>
  2. typedef struct student
  3. {
  4.   char  name[16];
  5.   int     age;
  6.   float  marks;
  7. }stu;
  8. main()
  9. {
  10.   stu *p;
  11.   [b]p=(stu *)malloc(sizeof(struct student));[/b]
  12.   scanf("%s",p->name);
  13.   fflush(stdin);
  14.   scanf("%d",&p->age);
  15.   fflush(stdin);
  16.   scnaf("%f",&p->marks);

  17.    ......
  18. }

复制代码


感觉楼主是还没学好指针那部分内容
回复

使用道具 举报

发表于 2006-6-18 01:04 | 显示全部楼层
路过,顺便大声说下:"我讨厌指针!!!!!!"
回复

使用道具 举报

发表于 2006-6-18 01:08 | 显示全部楼层
楼上的师兄……
回复

使用道具 举报

发表于 2006-6-18 01:08 | 显示全部楼层
不,没有指针,C语言还可以做什么?
回复

使用道具 举报

发表于 2006-6-18 04:08 | 显示全部楼层
hello world!
回复

使用道具 举报

发表于 2006-6-18 10:11 | 显示全部楼层
似乎不可以,因为printf()这个函数也用到指针!
没去研究过C语言的可变参数.
回复

使用道具 举报

发表于 2006-6-18 10:35 | 显示全部楼层
printf()
原型好像是:

int printf(const char *format,[argument...])

[ 本帖最后由 iptton 于 2006-6-18 10:37 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2006-6-18 10:50 | 显示全部楼层
是不是一定在用结构体的时候才用到CALLOC,我平时这样想申请一块内存用来存某些数据不可以吗?为什么我见过的例子都会有结构体?不用结构体的例子有没有?
回复

使用道具 举报

发表于 2006-6-18 11:01 | 显示全部楼层
动态申请的好处是:  避免浪费空间     

一般在用静态方法声明变量时无法确定大小的变量   就要用动态申请

比如,一个学生管理系统里,用户要输入信息,但用户一次输入多少 是预先无法知道的

(没用过C做过大一点的东西,只知道这么多了…………高手补充……我也想具体知道点)
回复

使用道具 举报

发表于 2006-6-18 11:05 | 显示全部楼层
原型:extern void *malloc(unsigned int num_bytes);
  
  用法:#include <alloc.h>
  
  功能:分配长度为num_bytes字节的内存块
  
  说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
        当内存不再使用时,应使用free()函数将内存块释放。

这样用也可以的:
char *p;
p=(char *)malloc(100);

当你有需要的时候,自然会慢慢理解的!
回复

使用道具 举报

 楼主| 发表于 2006-6-19 00:05 | 显示全部楼层
帮忙看看我这个程序,为什么得不到我想要的结果?我想申请一块空间用来存10个双精度数据,然后把这十个数据相乘,输出结果。但按我以下的程序结果系0。想了很久还想不通,希望高手们指点指点!^_^!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define LEN sizeof(double)
  4. void main()
  5. {double*p;double a[10];int i;double amass;
  6. p=(double*)calloc(10,LEN);
  7. p=a;
  8. for(i=0;i<10;i++)
  9.   scanf("%f",&a[i]);
  10. for(i=0;i<10;i++)
  11.   printf("%f\n",a[i]);
  12.   amass=1 ;
  13. for(i=9;i>0;i--)
  14.    amass=amass*a[i];
  15. printf("%f",amass);
  16.   getch();
  17.   }
复制代码
回复

使用道具 举报

发表于 2006-6-19 00:38 | 显示全部楼层
首先楼上可以参考下这段代码有错吗?(关于 scanf)

楼上申请了空间给p,然后又扔掉。
我改了scanf("%f")为scanf("%lf");在DEV-CPP下编译运行正常。
回复

使用道具 举报

 楼主| 发表于 2006-6-19 22:52 | 显示全部楼层
原帖由 powerwind 于 2006-6-19 00:38 发表
首先楼上可以参考下这段代码有错吗?(关于 scanf)

楼上申请了空间给p,然后又扔掉。
我改了scanf("%f")为scanf("%lf");在DEV-CPP下编译运行正常。


我按照你所说的在TC下面运行,是可以的,谢了。:victory:

但我还有点不明,你说我“申请了空间给p,然后又扔掉”是什么意思啊?由于我刚学calloc,还有很多不明白的地方,所以能不能详细地说说啊?我怎样才能实现我想要做的?
回复

使用道具 举报

发表于 2006-6-19 23:22 | 显示全部楼层
把数组a删除,用到a的地方改成p
删除这两句:
p=a;
double a[10];
其它用到a替换成p
回复

使用道具 举报

 楼主| 发表于 2006-6-20 20:32 | 显示全部楼层
为什么会这样?能不能说清楚啊?
回复

使用道具 举报

发表于 2006-6-20 22:19 | 显示全部楼层
p=(double*)calloc(10,LEN); //在这里,给p分配了内存空间,p就指向了那块新的空间

p=a;//在这里,p又指向数组a,则p指向了数组a的那块空间,原来的那块没用了

如果楼上还是不明,可先对指针进行进一步学习,然后慢慢理解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 03:41

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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