malloc动态内存分配问题请教高手

一、为什么malloc函数需要强制类型转换?如果指针类型与强制转换类型不一致表示什么含义?int*p=(int*)malloc(sizeof(int));(1)一个int... 一、 为什么malloc函数需要强制类型转换?如果 指针类型 与 强制转换类型 不一致表示什么含义?
int *p = ( int *) malloc( sizeof( int ) );
(1)一个int 类型的指针指向一个大小为sizeof( int )的内存空间,为什么需要( int *)做前缀?
(2)如果写的类型不对应会出现什么问题?
例如:
double *p = ( double *) malloc( sizeof( int ) ); //在VC++6.0编译环境int 4字节
int *p = ( double *) malloc( sizeof( double ) ); //在VC++6.0编译环境double 8字节
char *p = ( char *) malloc( sizeof( char ) ); //在VC++6.0编译环境char 1字节
// 向众多高手请教malloc函数具体含义

二、malloc函数后面需要的大小是什么含义?
C语言malloc中如果我这样写:
int *p = (int *) malloc( sizeof( int ) );
就是用一个p指针指向分配的一段动态内存,大小为sizeof( int )

但是我这样写:
int *p = ( int *) malloc( 200 );
就是用一个p指针指向分配的一段动态内存,大小为200字节,但是由于int是4字节(在VC++6.0编译环境下),所以这段内存空间就可以当作25块int空间来使用吗?如果不是则应该是怎样的?

类似的写法还有很多,不再乱写。。。

=========================================================================
千言万语一句话:关于malloc函数在线等求众多高手详解.......小弟在此谢过!
展开
 我来答
DK小黑
2013-08-05 · TA获得超过339个赞
知道小有建树答主
回答量:96
采纳率:100%
帮助的人:84.2万
展开全部
(1)malloc()函数的原型是:void *malloc(size_t size),但是在ANSI C之前的C语言,没有void *这中类型,所以malloc()的返回值被定义为char *,如果赋给其他类型的指针变量,就需要强制类型转换,否则出错;
(2)目前,已经不需要这么写了,因为void *类型的指针可以赋值给任意类型的指针变量;
(3)malloc()是根据括号里参数指定的大小分配内存空间的,sizeof的作用就是提供一个数值,所以可以用数字(比如200)来替代,200个字节也就相当于50个int变量的大小(前提:int为4个字节);
(4)double *p=(double*)malloc(sizeof(int));,可能导致内存分配不足,p本想请求double大小的内存,现在只有int大小;
(5)int *p = (double *)malloc(sizeof(double));,这句会出错,因为p是int *类型,而等号右边是double *类型,不能这么赋值。
追问
高手我还是不明白:
int *p = ( int *) malloc( 200 );
p指针指向申请的200字节空间,但是int为4字节,这个200字节空间就被分成50份int类型小空间,但是我这样写:
*p =20000;
这样只有一份int小空间里面写着20000,那么那其余的49份int类型小空间是不是全是0?还是那其余的49份int类型小空间根本识别不到?
追答
经过实验得到结果:使用malloc()后,剩余的那些未赋值的小空间会被初始化为0。
中智咨询
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。... 点击进入详情页
本回答由中智咨询提供
__int64
2013-08-06 · TA获得超过663个赞
知道小有建树答主
回答量:484
采纳率:0%
帮助的人:396万
展开全部
一、关于强制转换
先看 malloc 的函数原型:
void* malloc(size_t size);
即,动态分配一块 size 大小的连续内存,并把这块内存的起始地址返回给调用者。malloc 返回的指针类型是 void* 类型。注意,void* 是一种类型。
接着看:

int *p = ( int *) malloc( sizeof( int ) );

等价于:
size_t size = sizeof(int);
void * ptr = malloc(size);
int* p = (int*)ptr; // 因为类型不同,所以要做强制类型转换。
看到这里,应该回答了你第一个小题:为什么需要( int *)做前缀

接着看:
double *p = (double *) malloc(sizeof(int));
假设你是在 32 位机上。double *p 指向一个 double[8字节],但是你只分配了 4 字节的内存给他,这个时候如果你用 *p 去读,就要读 8 个字节,明显的读越界了。读越界各个操作系统处理的不一样,有的时候程序会 core 掉,有的时候不会。
int *p = ( double *) malloc( sizeof( double ) );
这个时候 *p 只能访问到 4 个字节,你却给他分配了 8 个字节,那么,后面的 4 个字节永远访问不到,也就白白浪费掉了。
二、malloc函数后面需要的大小是什么含义?
malloc 接受的 size 就是你要分配的内存的大小。
int *p = ( int *) malloc( 200 );
这个时候,你分配了 200 个字节,在 32 位机器上,可以存 25 个int。
这个时候你可以这么写:
for (int idx = 0; idx != 25; ++idx) {
*p++ = idx;

}
指针也是可以运算的。动态数组都是这么做的。

多写点实验代码,慢慢就理解了。
追问
感谢高手详细解答,只是我还有一事未明:
int *p = ( int *) malloc( 200 );
p指针指向申请的200字节空间,但是int为4字节,这个200字节空间就被分成50份int类型小空间,但是我这样写:
*p =20000;
这样只有一份int小空间里面写着20000,那么那其余的49份int类型小空间是不是全是0?还是那其余的49份int类型小空间根本识别不到?
追答
int *p = ( int *) malloc(  200  );

*p = 20000;
这个时候,p[0] == 20000;p[1-49] 里面的数据是不确定的。因为 malloc 只负责分配内存,并不负责初始化这块内存里面的数据。好比你去食堂吃饭,malloc 告诉你这 50 个桌子给你用了,但不会帮你把桌子收拾好,如果这写桌子以前有人用过,上面可能还有残羹冷炙,碰巧你来的早,还没有人用过,那这写桌子就是干净的。一般malloc分配内存后,都会调用 memset,把这块内存空间全部设置为 0。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式