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函数在线等求众多高手详解.......小弟在此谢过! 展开
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函数在线等求众多高手详解.......小弟在此谢过! 展开
展开全部
(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 *类型,不能这么赋值。
(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。
展开全部
一、关于强制转换
先看 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;
}
指针也是可以运算的。动态数组都是这么做的。
多写点实验代码,慢慢就理解了。
先看 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。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询