一个malloc问题

shuirh 2009-03-08 10:36:03
p1 = (char*)(malloc(len + 1));
这句话,为什么我把char两边的括号去掉就报错啊?

请大家多多指教啊.
...全文
198 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
没有括号,就要遵守优先级,但是如果遵守那个优先级的话,这个函数的调用就会出错啊
na2650945 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 shuirh 的帖子:]
p1 = (char*)(malloc(len + 1));
这句话,为什么我把char两边的括号去掉就报错啊?

请大家多多指教啊.
[/Quote]
在C++中。
指针的强制类型转换不支持T(e)的格式。
还有。
malloc返回的确是void*的指针。
所以要强制类型转换。
还有。
The C++ Programming Language.
里面说。
不建议用这么C风格的内存管理。
小强提包包 2009-03-13
  • 打赏
  • 举报
回复
malloc(len + 1))只为你分配一段内存空间,至于你想把它当成什么样的内存空间,是由你来决定,所以返回的是void*,所以你再强制转换成你需要的指针类型,如果去掉括号的话,根本不符合语法的要求
yangchaomef 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fableboy 的回复:]
malloc返回的void*,如果不做类型转换告诉编译器具体类型是什么,那么将发生无法预期的错误,所以不能对一个void×直接赋值给char×。如果不加括号?则会以为先×(malloc(...)),转换为指针,再char(×(malloc(...))),转换为char型的了,指针类型转换为char型,那不就出错了吗?
[/Quote]
char(×(malloc(...)))这样的语法并不会转换为char型,如果char 没有使用括号,并不是表示强转,另外,如果将指针类型强转为char型,也是可以了,并不会报error,知会提示一个warning,指针4字节转为char类型1个字节,仅仅丢失精度而已。
jakqigle 2009-03-08
  • 打赏
  • 举报
回复
×代表*
jakqigle 2009-03-08
  • 打赏
  • 举报
回复
malloc返回的void*,如果不做类型转换告诉编译器具体类型是什么,那么将发生无法预期的错误,所以不能对一个void×直接赋值给char×。如果不加括号?则会以为先×(malloc(...)),转换为指针,再char(×(malloc(...))),转换为char型的了,指针类型转换为char型,那不就出错了吗?
lostmiracle 2009-03-08
  • 打赏
  • 举报
回复
为什么不好好看错误信息呢
xingkongtianma 2009-03-08
  • 打赏
  • 举报
回复
学习
qq675927952 2009-03-08
  • 打赏
  • 举报
回复
up LS各位
Chevin 2009-03-08
  • 打赏
  • 举报
回复
mark and up
shenjigong19801109 2009-03-08
  • 打赏
  • 举报
回复
因为char*严格的说是一个字符的指针类型,你要是分开写从运算符的角度讲就错了,所以要加上括号。
cnStreamlet 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 shuirh 的帖子:]
p1 = (char*)(malloc(len + 1));
这句话,为什么我把char两边的括号去掉就报错啊?

请大家多多指教啊.
[/Quote]

去掉括号?变成 p1 = char*(malloc(len + 1)); 吗?这是什么语法呢?
malloc() 返回的是 void * 变量,先不管 malloc() 的作用,假设现在有一个
void *p;
现在写这么一句:

p1 = (char *)p;
表示把 p 强制转换成 char * 赋给 p1。

如果写成 p1 = char *p,那是什么意思呢?不合语法阿
Laozql 2009-03-08
  • 打赏
  • 举报
回复
学习
zhangchaokun 2009-03-08
  • 打赏
  • 举报
回复
()是强制转换的意思,当然不能随便去掉
  • 打赏
  • 举报
回复
你是强制转换,语法上不就要加撒.
lingyin55 2009-03-08
  • 打赏
  • 举报
回复
转个例子

void Test(int *pi)

{

void *pv = pi; //ok ,从 int* 到 void* 的隐式转换

*pv ; //错误:void* 不能间接引用

pv++; //错误:void* 不能增量(不知道被指定类型的大小)

int *pi1 = static_cast<int*>(pv); //ok: 显式转换回 int*

double * pi2 = pv; //错误

double *pi3 = pi; //错误

double *pi4 = static_cast<double*>(pv); //ok: 不安全

}



1.一般来说,如果一个指针被转换(“强制”,cast)到与被批对象的实际类型不同的指针,使用后一个指针就是不安全的。 void* 的最重要用途是需要向函数传递一个指针,而又不能对对象的类型做任凭假设。还有就是从函数返回一个无类型的对象。要使用这样的对象。必须通过显式的类型转换。

2,到函数的指针与到成员的指针都不能赋给void*
lingyin55 2009-03-08
  • 打赏
  • 举报
回复
以我个人的理解

malloc返回的是一个void*类型的值,对于一个void*的值,编译器是不知道它究竟指向的是哪一种类型,因此所有对它的操作都是危险的,将会引起编译的错误,除非首先对它进行类型转换。如果去掉括号,那么是对返回的这个void*的值进行取值操作,这就会引起上面说的编译错误,加了括号则是对它先进行类型的转换。


[Quote=引用楼主 shuirh 的帖子:]
p1 = (char*)(malloc(len + 1));
这句话,为什么我把char两边的括号去掉就报错啊?

请大家多多指教啊.
[/Quote]
sagegz 2009-03-08
  • 打赏
  • 举报
回复
强制转换,本来malloc的返回类型是void*.
ziqing_deshi 2009-03-08
  • 打赏
  • 举报
回复
都解释的很清楚了。。
leo315 2009-03-08
  • 打赏
  • 举报
回复
lz应该明白了吧,大家解释的都挺清楚的。
加载更多回复(10)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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