关于malloc函数和void

xiaoyali 2009-07-30 04:28:11
1, 用malloc函数申请空间:
例如:
int len = 100;


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


或者:

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



请问int *必须加吗? 不加也可以运行程序的, 而且有时候连warnning 都没有啊, 那个Int*是什么意思?
返回的不就是地址吗, 而P也是指针啊, 为什么我见好多地方都有强制类型转换的做法的


原型:
void *malloc(size_t size)
返回值是:已分配内存的首地址



2。 那个void 和void*有哪位同学可以指点一下, 我觉得void本来就不需要返回类型, 那要那个void * 干嘛呀?



...全文
386 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
david-yue 2009-08-01
  • 打赏
  • 举报
回复
高手挺多的,呵呵
lqcharles 2009-08-01
  • 打赏
  • 举报
回复
呵呵,基础问题
dfkjsdhfks 2009-08-01
  • 打赏
  • 举报
回复
学习
deerwin1986 2009-07-31
  • 打赏
  • 举报
回复
void* 也是个指针啊。。。 而且可以转型为任何特定类型的指针。。。
加上(int*)就可以避免警告啦。。。 因为是你自己要求转换的。。。显式的。。。
yxq281426250 2009-07-31
  • 打赏
  • 举报
回复
大家说得已经很清楚了
ies_sweet 2009-07-31
  • 打赏
  • 举报
回复
在C里,最难的就是隐式转换
所以,还是建议楼主进行 显示的 强转

这样,怎么转的自己心里清楚,
不要让编译器来做这些工作,
因为不同的编译器行为可能不同
zbihong 2009-07-31
  • 打赏
  • 举报
回复
学习了!
laser_1987 2009-07-31
  • 打赏
  • 举报
回复
3楼和5楼的是正解
jiayucunyan 2009-07-31
  • 打赏
  • 举报
回复
楼上有很多人没弄清楚void
我建议大家看看《c专家编程》
这里有写这部分内容

c语言中有很多符号重载
void就是其中之一,
作为函数的返回类型,表示不返回任何值
在指针声明中,表示通用指针的类型
位于参数列表中,表示没有参数

关于为什么要强制转换,5楼说的很清楚。
想想,如果是你设计malloc函数,你会返回什么值呢?不用void*能用什么?
你根本没法确定调用malloc函数,请求的地址里保存的是什么类型的数据。
比如你用char*,和wchar*肯定就不一样。
yshuise 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zyq1600356618 的回复:]
引用楼主 xiaoyali 的回复:

2。  那个void 和void*有哪位同学可以指点一下, 我觉得void本来就不需要返回类型, 那要那个void * 干嘛呀?


void表示什么都么有  void*表示指向一个"什么都没有"的指针  同时各种指针之间是可以相互强制转换的

只有编译器检查指针的合法性, 程序运行时是不检查的 ,只有运行结果不同
[/Quote]
void* 是可以确定的,sizeof(void*) = 4
sizeof(void)=?
zyq1600356618 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaoyali 的回复:]

2。  那个void 和void*有哪位同学可以指点一下, 我觉得void本来就不需要返回类型, 那要那个void * 干嘛呀?

[/Quote]
void表示什么都么有 void*表示指向一个"什么都没有"的指针 同时各种指针之间是可以相互强制转换的

只有编译器检查指针的合法性, 程序运行时是不检查的 ,只有运行结果不同
ye0915715 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fandelei1982 的回复:]
int *p 说明p的类型是int * 即:p是指向int型数据的指针,p的值为内存地址,而int说明该内存存放的数据类型是int型,而malloc返回的类型是void *,即表明返回的是申请的内存的首地址,但没说明该内存区域存放的数据的类型,所以需要强制类型转换。
p的虽然都是地址,但是根据地址处数据的类型的不同,p的相同的加减操作,其地址值加减不同,大小为sizeof(type)。
C/C++ code
#include<stdio.h>int main(int argc,char*argv[])
{int len=100;int*p= (int*)malloc(len*sizeof(int)) ;double*pd= (double*)p;char*pc= (char*)p;

printf("%p\n",p);
printf("\n");

printf("%p\n",++p);
printf("%p\n",++pd);
printf("%p\n",++pc);return0;
}

[/Quote]

同上
superbtl 2009-07-30
  • 打赏
  • 举报
回复
int *p = (int *)malloc(len * sizeof(int))
在有些编译器必须加的
是以int型为节点 p++就是加了4个字节的长度
piaoyingmin 2009-07-30
  • 打赏
  • 举报
回复
要看是什么编译器了
lijian22500 2009-07-30
  • 打赏
  • 举报
回复
C会隐式转换。
friendly_ 2009-07-30
  • 打赏
  • 举报
回复
int *p 说明p的类型是int * 即:p是指向int型数据的指针,p的值为内存地址,而int说明该内存存放的数据类型是int型,而malloc返回的类型是void *,即表明返回的是申请的内存的首地址,但没说明该内存区域存放的数据的类型,所以需要强制类型转换。
p的虽然都是地址,但是根据地址处数据的类型的不同,p的相同的加减操作,其地址值加减不同,大小为sizeof(type)。

#include <stdio.h>

int main(int argc, char *argv[])
{
int len = 100;
int *p = (int*)malloc(len * sizeof(int)) ;
double *pd = (double *)p;
char *pc = (char *)p;

printf("%p\n",p);
printf("\n");

printf("%p\n",++p);
printf("%p\n",++pd);
printf("%p\n",++pc);

return 0;
}


飞天御剑流 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaoyali 的回复:]
1, 用malloc函数申请空间:
例如:
int len = 100;

int *p =(int *)malloc(len * sizeof(int))
或者:
int *p =  malloc(len * sizeof(int))
请问int *必须加吗? 不加也可以运行程序的, 而且有时候连warnning 都没有啊, 那个Int*是什么意思?
返回的不就是地址吗, 而P也是指针啊, 为什么我见好多地方都有强制类型转换的做法的
[/Quote]

这个问题c与c++是不同的,c允许void*指针与普通指针互相赋值,但c++不允许void*指针赋予普通指针,必须经过强制转换才可以。

因此c中你可以直接int *p = malloc....,在语法上是没有问题的。但从一个良好的风格出发,使用强制转换可以利于代码日后向c++移植,否则,要进行不那么让人愉快的修改。
lbh2001 2009-07-30
  • 打赏
  • 举报
回复
C下,建议 int *p = malloc(len * sizeof(int))
C++下,建议 int *p = (int *)malloc(len * sizeof(int))
因为C++下有更严格的类型检查


C标准并不要求强制转换,在赋值时会将void *隐式转换成相应类型的指针。

对malloc的返回类型强制转换时传统C的习惯用法,因为传统C中malloc返回char *,隐式转换会产生警告

但为了保持C++兼容,还是需要返回类型强制转换的
小猪头是猪 2009-07-30
  • 打赏
  • 举报
回复
void 指的是返回不是指针类型 返回的是无符号
void *返回的无符号指针
jiang5495 2009-07-30
  • 打赏
  • 举报
回复
void *是个万能指针,主要是因为所有的指针都占一个机器字的空间,而且void 指针可以隐式地转化为其他类型的指针,但并不是说,他们就一样了,int *p = malloc(len * sizeof(int)) 这样也能过我想是经过了隐式的强制类型转换

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧